Tela preta aleatória após a instalação do pacote de lançamento em alguns modelos de vibração do Android

No estágio inicial de desenvolvimento e depuração, o pacote de depuração estava sempre em execução no dispositivo real e nenhum problema aleatório de tela preta foi encontrado. Depois de preparar o pacote de lançamento, alguns modelos Android terão problemas aleatórios de tela preta. Depois de verificar as informações, As razões são as seguintes:

1. Confusão (não resolvida):

Adicione a seguinte configuração no arquivo android/app/build.gradle

buildTypes {
    release {
        minifyEnabled false //关闭混淆
        shrinkResources false //删除无用资源
        signingConfig signingConfigs.release
        ...
    }
}

2. Desative a compactação R8 e use a compactação D8 (não resolvida):

Adicione o arquivo android/gradle.properties

# 开启D8压缩
android.enableD8=true
# 关闭R8压缩
#android.enableR8=true

Após as tentativas acima, o problema não foi resolvido. Então, considere se o ciclo de vida do Android e do flutter é inconsistente? O projeto usa o framework fishredux?

Escreva o ciclo de vida nativo do Android no arquivo android/app/src/main/kotlin/.../MainActivity.kt. , então os detalhes específicos que não foram executados O motivo não é claro, mas não tem nada a ver com a inconsistência do ciclo de vida.

Substituir a página pelo método de escrita nativo do flutter não usa fishredux e o problema não é resolvido após a recompilação.

Este problema está preso em mim há mais de uma semana. Não consigo localizar o problema sem relatar um erro, e o release não pode interromper o ponto. Estou um pouco desesperado. Finalmente, acho que não é o suficiente para refatorar? Será que há algum problema com a configuração da dependência ou do ambiente? Nesse caso, podemos apenas confiar em uma dependência e verificar a outra, e reconfigurar o ambiente para ver onde está o problema, mas eu realmente quero chorar se tenho tanto tempo para ficar online....

Primeiro verifiquei se era um problema de dependência. Flutter criou um novo projeto e introduziu as dependências do projeto original por sua vez. Achei que as dependências estavam boas, mas não houve problema de tela preta quando o novo projeto foi lançado! A diferença do projeto original é apenas que o arquivo principal da entrada é diferente. Substitua o arquivo principal do novo projeto pelo projeto original, e não há tela preta após apertar o release, OK! É o problema no arquivo principal! ! !

A seguir está a causa do problema! resolver! ! !

Existe um pedaço de código no arquivo principal:

window.physicalSize monitora o tamanho da tela e executa o callback window.onMetricsChanged quando não está vazio

if(window.physicalSize.isEmpty){
    window.onMetricsChanged = (){
        //在回调中,size仍然有可能是0
        if(!window.physicalSize.isEmpty){
            window.onMetricsChanged = null;
            runMyAPP();
        }
    };
} else{
    //如果size非0,则直接runApp
    runMyAPP();
}

Suspeitei que fosse um problema com este código, então comentei todos os julgamentos lógicos neste parágrafo, deixando apenas runApp. Após a recompilação, descobri que não havia tela preta, mas apareceu uma desordem aleatória na página.

O motivo da tela preta e da confusão da página é que a vibração renderiza a página quando o tamanho da tela ainda está vazio para acelerar a inicialização. Antes de verificar runApp, você deve primeiro WidgetsFlutterBinding.ensureInitialized() para garantir que haja uma instância de WidgetsFlutterBinding. Modifique o código acima para:

if(window.physicalSize.isEmpty){
    window.onMetricsChanged = (){
        //在回调中,size仍然有可能是0
        if(!window.physicalSize.isEmpty){
            window.onMetricsChanged = null;
            runMyAPP();
        }
    };
} else{
    //如果size非0,则直接runApp
    runMyAPP();
}

void runMyApp() async{
    WidgetsFlutterBinding.ensureInitialized();
    runApp(MyApp());
}

Após a compilação, o problema ainda não foi resolvido. Alguém no Stack Overflow encontrou o mesmo problema e forneceu um trecho de código:

import 'dart:async';
import 'dart:ui';
import 'package:flutter/widgets.dart';

Future<void> waitScreenSizeAvailable() async {
  if (!_hasScreenSize) {
    WidgetsFlutterBinding.ensureInitialized();
    var observer = _Observer();
    WidgetsBinding.instance.addObserver(observer);
    await observer.hasScreenSize;
    WidgetsBinding.instance.removeObserver(observer);
  }
}

bool get _hasScreenSize => !window.physicalSize.isEmpty;

class _Observer extends WidgetsBindingObserver {
  final _screenSizeCompleter = Completer<void>();

  Future<void> get hasScreenSize => _screenSizeCompleter.future;

  @override
  void didChangeMetrics() {
    if (!_screenSizeCompleter.isCompleted && _hasScreenSize) {
      _screenSizeCompleter.complete();
    }
  }
}

Modifique o código no arquivo principal para:

if(window.physicalSize.isEmpty){
    window.onMetricsChanged = () async {
        //在回调中,size仍然有可能是0
        if(!window.physicalSize.isEmpty){
            window.onMetricsChanged = null;
            await waitScreenSizeAvailable(); //引入上面那段代码
            runMyAPP();
        }
    };
} else{
    //如果size非0,则直接runApp
    await waitScreenSizeAvailable(); //引入上面那段代码
    runMyAPP();
}

Após a compilação, o problema está resolvido! ! ! ! !

Este problema está travado há quase duas semanas antes e depois. Não há mensagem de erro durante todo o processo, o que impossibilita a localização do problema. Além disso, o lançamento não pode interromper o ponto, então só posso adivinhar cegamente onde o problema pode ser e, em seguida, investigue passo a passo. Mas finalmente está resolvido, com lágrimas nos olhos...

Acho que você gosta

Origin blog.csdn.net/YML_426/article/details/129730925
Recomendado
Clasificación