繁体   English   中英

Flutter:此小部件已被卸载,因此 State 不再具有上下文(并且应被视为已失效)使用 streambuilder 时出错

[英]Flutter : This widget has been unmounted, so the State no longer has a context (and should be considered defunct) Error when using streambuilder

    class _MyAppState extends State<MyApp> {
  bool isFirstTime = true;
  bool? isRegistered;
  checkIfRegisteredOrNot() async {
    print("Checking if registered");
    if (isFirstTime && mounted) {
      print("Insided mounted");
      final id = FirebaseAuth.instance.currentUser!.uid;
      DocumentSnapshot ds =
          await FirebaseFirestore.instance.collection("users").doc(id).get();
      setState(() {
        print("Setting state");
        isRegistered = ds.exists;
        isFirstTime = false;
        print("isRegistered: $isRegistered");
        print("isFirstTime: $isFirstTime");
      });
    }
  }

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SehatMand',
      theme: ThemeData(
          scaffoldBackgroundColor: Color(0xFF222831),
          inputDecorationTheme: InputDecorationTheme(
            enabledBorder: OutlineInputBorder(
                borderRadius: BorderRadius.circular(2),
                borderSide: BorderSide(color: Colors.deepPurpleAccent)),
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(2),
              borderSide: BorderSide(color: Colors.deepPurpleAccent, width: 5),
            ),
          ),
          colorScheme: ColorScheme.dark().copyWith(
            secondary: Colors.deepPurpleAccent,
          )),
      home: StreamBuilder(
        stream: FirebaseAuth.instance.authStateChanges(),
        builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
          if (snapshot.hasData) {
            print("Has data");
            checkIfRegisteredOrNot();
            if (isRegistered != null) {
              return isRegistered! ? const TestScreen() : const FormScreen();
            } else {
              print("isRegistered is null");
              return const Scaffold(
                  body: Center(child: CircularProgressIndicator()));
            }
          } else {
            print('LoginScreen');
            return const LoginScreen();
          }
        },
      ),
      routes: {
        MainScreen.routeName: (context) => MainScreen(),
        FormScreen.routeName: (context) => const FormScreen(),
      },
    );
  }
}

我收到的错误说明

========调度程序库捕获异常===================================== ================ 在调度程序回调期间抛出以下断言:此小部件已卸载,因此 State 不再具有上下文(应被视为已失效)。

**> 考虑在“处置”或使用

"mounted" getter 以确定 State 是否仍处于活动状态。 当抛出异常时,这是堆栈:#0 State.context。 (包:flutter/src/widgets/framework.dart:942:9)#1 State.context(包:flutter/src/widgets/framework.dart:948:6)#2_TransformerPageViewState._onGetSize(包:another_view/transformer_page /another_transformer_page_view.dart:450:24) #3 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15) #4 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.82964024 :9) #5 SchedulerBinding.scheduleWarmUpFrame。 (包:flutter/src/scheduler/binding.dart:862:7)(从 class _RawReceivePortImpl、class _Timer、dart:async 和 dart:async 中删除了 11 帧)==**patch8:29646 ================================================ =========================================

在调用 setstate 之前做一个 if(mounted) 检查

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM