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...