You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:55:57