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

Flutter如何先检测网络连接再初始化Firebase?

解决方案:仅在有网络时初始化Firebase

你的核心问题在于Firebase初始化被提前执行(main函数里直接调用,以及MainPage里的_initialization会在类实例化时立即触发),没有和网络检查逻辑联动。下面是调整后的完整代码和关键说明:

步骤1:修改main函数,移除提前的Firebase初始化

把main里的await Firebase.initializeApp()删掉,让初始化逻辑完全交给MainPage处理:

bool hasInternet = false;

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);

  // 移除这里的Firebase初始化
  runApp(const MyApp());
}

步骤2:重构MainPage逻辑,关联网络检查与Firebase初始化

调整MainPage的状态管理,先确认网络连接再执行Firebase初始化,同时监听网络变化:

class MainPage extends StatefulWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  late StreamSubscription internetSubscription;
  bool hasInternet = false;
  Future<FirebaseApp>? _firebaseInitialization; // 改为可空,按需初始化

  @override
  void initState() {
    super.initState();
    // 先检查当前网络状态
    _checkInitialInternetStatus();
    // 监听网络状态变化
    internetSubscription = InternetConnectionChecker().onStatusChange.listen((status) {
      setState(() {
        hasInternet = status == InternetConnectionStatus.connected;
      });
      // 网络恢复时,若Firebase未初始化则触发
      if (hasInternet && _firebaseInitialization == null) {
        setState(() {
          _firebaseInitialization = Firebase.initializeApp();
        });
      }
      // 断网时提示
      if (!hasInternet) {
        showSnackBarMsg(context, noInternet, 10);
      }
    });
  }

  // 检查初始网络状态
  Future<void> _checkInitialInternetStatus() async {
    final status = await InternetConnectionChecker().connectionStatus;
    setState(() {
      hasInternet = status == InternetConnectionStatus.connected;
      // 初始有网则直接初始化Firebase
      if (hasInternet) {
        _firebaseInitialization = Firebase.initializeApp();
      }
    });
  }

  @override
  void dispose() {
    internetSubscription.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 无网络时显示重试页面
    if (!hasInternet) {
      return Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text("请检查网络连接"),
              const SizedBox(height: 16),
              ElevatedButton(
                onPressed: () => _checkInitialInternetStatus(),
                child: const Text("重试"),
              )
            ],
          ),
        ),
      );
    }

    // 有网络但Firebase未初始化时显示加载
    if (_firebaseInitialization == null) {
      return const Scaffold(
        body: Center(child: Text("正在初始化...")),
      );
    }

    // Firebase初始化流程
    return FutureBuilder(
      future: _firebaseInitialization,
      builder: (context, snapshot) {
        if (snapshot.hasError) {
          return Scaffold(
            body: Center(
              child: Text("初始化失败: ${snapshot.error}"),
            ),
          );
        }

        if (snapshot.connectionState == ConnectionState.done) {
          return StreamBuilder(
            stream: FirebaseAuth.instance.authStateChanges(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.active) {
                final user = snapshot.data;
                return user == null 
                    ? const LoginSignupScreen() 
                    : const Today_Home();
              }
              return const Scaffold(
                body: Center(child: Text("检查登录状态...")),
              );
            },
          );
        }

        return const Scaffold(
          body: Center(child: Text("连接到应用...")),
        );
      },
    );
  }
}

关键调整说明

  • 延迟Firebase初始化:将_firebaseInitialization设为可空Future,仅在确认有网络时才触发初始化。
  • 初始网络检查:在initState中同步检查当前网络状态,避免页面刚加载时的逻辑断层。
  • 网络变化联动:监听网络状态,断网时提示用户,联网后自动触发未完成的Firebase初始化。
  • 分层UI反馈:根据网络状态、Firebase初始化阶段分别显示对应UI,提升用户体验。

内容的提问来源于stack exchange,提问作者Laurent Thomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:25:27