Flutter应用加载动画循环卡顿及PlatformException问题求助
Flutter启动加载动画循环卡顿无法跳转,PlatformException(channel-error) 问题解决
问题现象
应用启动后加载动画持续循环,无法跳转到HomePage,moveNext函数卡在第一行执行,调试控制台抛出异常:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(channel-error, Unable to establish connection on channel., null, null)
用户提供代码与环境信息
Firebase初始化代码
_initializeFirebase() { Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); }
flutter doctor -v 检测结果
[√] Flutter (Channel stable, 3.13.8, on Microsoft Windows [Version 10.0.19045.3570], locale en-IN) • Flutter version 3.13.8 on channel stable at C:\src\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 6c4930c4ac (6 days ago), 2023-10-18 10:57:55 -0500 • Engine revision 767d8c75e8 • Dart version 3.1.4 • DevTools version 2.25.0 [√] Windows Version (Installed version of Windows is version 10 or higher) [√] Android toolchain - develop for Android devices (Android SDK version 33.0.2) • Android SDK at C:\Users\CodeVault\AppData\Local\Android\sdk • Platform android-33-ext4, build-tools 33.0.2 • Java binary at: C:\Program Files\Android\Android Studio\jbr\bin\java • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694) • All Android licenses accepted. [√] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe [√] Android Studio (version 2022.2) • Android Studio at C:\Program Files\Android\Android Studio • Flutter plugin can be installed from: https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.6+0-b2043.56-9586694) [√] VS Code (version 1.83.1) • VS Code at C:\Users\CodeVault\AppData\Local\Programs\Microsoft VS Code • Flutter extension version 3.74.0 [√] Connected device (3 available) • Chrome (web) • chrome • web-javascript • Google Chrome 118.0.5993.89 • Edge (web) • edge • web-javascript • Microsoft Edge 118.0.2088.61 [√] Network resources • All expected network resources are available.
主页面代码
class _MainAppState extends State<MainApp> { @override void dispose() { super.dispose(); } @override void initState() { moveNext(); _initializeFirebase(); super.initState(); } void reload() { setState(() {}); } Future<bool> _onWillPop() async { if (currentPage.length == 1) { return (await showDialog( context: context, builder: (context) => AlertDialog( title: Text('Are you sure?'), content: Text('Do you want to exit'), actions: <Widget>[ TextButton( onPressed: () => Navigator.of(context).pop(false), child: Text('No'), ), TextButton( onPressed: () => Navigator.of(context).pop(true), child: Text('Yes'), ), ], ), )) ?? false; } else { Navigation.pop(context); Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => MainApp())); return false; } } void moveNext() async { var prefs = await SharedPreferences.getInstance(); if (!noMove) { bool connected = await InternetConnectionChecker().hasConnection; bool? logIn = true; if (forceLogOut) { logIn = false; } else { if (prefs.getBool("isLoggedIn") != null) { if (prefs.getBool("isLoggedIn") == true) { logIn = true; } else { if (auth.currentUser != null) { logIn = true; } else { logIn = false; } } } else { logIn = false; } } if (connected) { Future.delayed(Duration(seconds: 1), () async { setState(() { internetConnected = true; }); if (!forceHomeScreen) { if (logIn != null) { if (logIn) { await AppAPI().getCurrentUser(); await AppAPI().getData(); Future.delayed(Duration(milliseconds: 2000), () async { setState(() { Navigation.pushReplace(context, homePage); setState(() {}); }); }); setState(() {}); } else { Future.delayed(Duration(milliseconds: 2000), () { setState(() { Navigation.pushReplace(context, Welcome()); forceLogOut = false; }); }); } } else { Future.delayed(Duration(milliseconds: 2000), () { setState(() { forceLogOut = false; Navigation.pushReplace(context, Welcome()); setState(() {}); }); }); } } else { setState(() { Navigation.pushReplace(context, homePage); setState(() {}); }); } }); } else { Future.delayed(Duration(seconds: 2), () { setState(() { internetConnected = false; Navigation.pushReplace(context, NoInternet()); setState(() {}); }); }); } } else { Future.delayed(Duration(seconds: 2)); setState(() {}); } } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, builder: (context, child) { return MediaQuery( data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), child: WillPopScope( onWillPop: _onWillPop, child: MaterialApp( debugShowCheckedModeBanner: false, home: currentPages.last)), ); }, ); } }
问题根源与解决步骤
1. Firebase初始化未等待完成
当前_initializeFirebase函数未等待初始化完成就执行moveNext,而moveNext中依赖auth.currentUser(Firebase实例),导致通道连接异常。
修改代码,先完成Firebase初始化再执行跳转逻辑:
Future<void> _initializeFirebase() async { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); } @override void initState() { super.initState(); _initializeFirebase().then((_) { moveNext(); }); }
2. 简化异步逻辑,减少嵌套
moveNext中多层Future.delayed和setState嵌套会导致异步流程混乱,优化如下:
void moveNext() async { var prefs = await SharedPreferences.getInstance(); if (noMove) { await Future.delayed(const Duration(seconds: 2)); setState(() {}); return; } bool connected = await InternetConnectionChecker().hasConnection; bool? logIn = true; if (forceLogOut) { logIn = false; } else { final isLoggedInPref = prefs.getBool("isLoggedIn"); logIn = isLoggedInPref != null ? (isLoggedInPref || auth.currentUser != null) : false; } if (connected) { await Future.delayed(const Duration(seconds: 1)); setState(() => internetConnected = true); if (forceHomeScreen) { Navigation.pushReplace(context, homePage); return; } if (logIn == true) { await AppAPI().getCurrentUser(); await AppAPI().getData(); await Future.delayed(const Duration(milliseconds: 2000)); Navigation.pushReplace(context, homePage); } else { await Future.delayed(const Duration(milliseconds: 2000)); setState(() => forceLogOut = false); Navigation.pushReplace(context, const Welcome()); } } else { await Future.delayed(const Duration(seconds: 2)); setState(() => internetConnected = false); Navigation.pushReplace(context, const NoInternet()); } }
3. 移除嵌套的MaterialApp
主页面嵌套两个MaterialApp会导致导航上下文异常,保留一个即可:
@override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, builder: (context, child) { return MediaQuery( data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0), child: WillPopScope( onWillPop: _onWillPop, child: child ?? currentPages.last, ), ); }, home: currentPages.last, ); }
4. 额外排查步骤
- 执行
flutter clean清理项目缓存后重新运行 - 确认Firebase配置文件(Android的
google-services.json、iOS的GoogleService-Info.plist)已正确放置 - 检查Firebase相关依赖版本与当前Flutter版本兼容
内容的提问来源于stack exchange,提问作者CodeVault
相关产品推荐
相关产品推荐

