【问题标题】:The method 'findAncestorStateOfType' was called on null on firebase logout在firebase注销时,方法'findAncestorStateOfType'被调用为null
【发布时间】:2020-09-28 15:29:44
【问题描述】:

当我尝试使用 firebase 注销时抛出错误。我尝试了这个解决方案,但它不适用于注销link。 Flutter Navigator 给出了链接中提到的错误,但该解决方案不起作用。

E/flutter (17712): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The method 'findAncestorStateOfType' was called on null.
E/flutter (17712): Receiver: null
E/flutter (17712): Tried calling: findAncestorStateOfType<NavigatorState>()
E/flutter (17712): #0      Object.noSuchMethod  (dart:core-patch/object_patch.dart:53:5)
E/flutter (17712): #1      Navigator.of 
package:flutter/…/widgets/navigator.dart:2115
E/flutter (17712): #2      Navigator.pushReplacement 
package:flutter/…/widgets/navigator.dart:1781
E/flutter (17712): #3      _HandleMainScreenState.checkAuthentication.<anonymous closure> 
package:monktree/main.dart:55
E/flutter (17712): #4      _rootRunUnary  (dart:async/zone.dart:1192:38)
E/flutter (17712): #5      _CustomZone.runUnary  (dart:async/zone.dart:1085:19)
E/flutter (17712): #6      _CustomZone.runUnaryGuarded  (dart:async/zone.dart:987:7)
E/flutter (17712): #7      _BufferingStreamSubscription._sendData  (dart:async/stream_impl.dart:339:11)
E/flutter (17712): #8      _BufferingStreamSubscription._add  (dart:async/stream_impl.dart:266:7)
E/flutter (17712): #9      _ForwardingStreamSubscription._add  (dart:async/stream_pipe.dart:134:11)
E/flutter (17712): #10     _MapStream._handleData  (dart:async/stream_pipe.dart:234:10)
E/flutter (17712): #11     _ForwardingStreamSubscription._handleData  (dart:async/stream_pipe.dart:166:13)
E/flutter (17712): #12     _rootRunUnary  (dart:async/zone.dart:1192:38)
E/flutter (17712): #13     _CustomZone.runUnary  (dart:async/zone.dart:1085:19)
E/flutter (17712): #14     _CustomZone.runUnaryGuarded  (dart:async/zone.dart:987:7)
E/flutter (17712): #15     _BufferingStreamSubscription._sendData  (dart:async/stream_impl.dart:339:11)
E/flutter (17712): #16     _DelayedData.perform  (dart:async/stream_impl.dart:594:14)
E/flutter (17712): #17     _StreamImplEvents.handleNext  (dart:async/stream_impl.dart:710:11)
E/flutter (17712): #18     _PendingEvents.schedule.<anonymous closure>  (dart:async/stream_impl.dart:670:7)
E/flutter (17712): #19     _rootRun  (dart:async/zone.dart:1180:38)

当我尝试使用 AppBar 的操作注销时,出现上述错误。我正在使用的代码。 Flutter navigator 出现错误,但我无法修复它。

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  signout() {
    FirebaseAuth.instance.signOut().then((value) {
      print(widget.user.uid);
      Navigator.pushReplacement(
          context, MaterialPageRoute(builder: (context) => LoginPage()));
    });
  }

  @override
  Widget build(BuildContext context) {
    _logout() {
      return showDialog(
          context: context,
          builder: (context) => AlertDialog(
                content: Text('Are you sure you want to logout'),
                actions: <Widget>[
                  FlatButton(
                      onPressed: () {
                        Navigator.pop(context);
                        signout();
                      },
                      child: Text('Yes')),
                  FlatButton(
                      onPressed: () {
                        Navigator.pop(context);
                      },
                      child: Text('No'))
                ],
              ));
    }

    return SafeArea(
        child: Scaffold(
      backgroundColor: Colors.white,
      drawer: CustomDrawer(
        user: widget.user,
        userData: userdata,
      ),
      appBar: AppBar(
          actions: <Widget>[
            Container(
                width: 200,
                alignment: Alignment.centerRight,
                child: AutoSizeText(
                  userdata['userName'],
                  overflow: TextOverflow.ellipsis,
                  maxLines: 2,
                  style: TextStyle(
                      color: Colors.black54,
                      fontSize: Constants.mediumText,
                      fontWeight: FontWeight.w600,
                      fontFamily: 'Segoe'),
                )),
            MaterialButton(
              onPressed: () {
                _logout();
              },
              child: Icon(
                Icons.exit_to_app,
                size: 30,
                color: Color(0xff747474),
              ),
            ),
          ],
          elevation: 1,
          leading: Builder(builder: (BuildContext context) {
            return MaterialButton(
                child: drawericon,
                onPressed: () => Scaffold.of(context).openDrawer());
          }),
          backgroundColor: Theme.of(context).canvasColor),
    ));
  }
}

【问题讨论】:

    标签: flutter


    【解决方案1】:
    signout() {
        FirebaseAuth.instance.signOut().then((value) {
          print(widget.user.uid);
          Navigator.pop(context);
      }
    

    将您的signout() 更改为上述内容应该可以。然后使用三元表达式,您可以检查用户令牌或uid != null

    例如:

    home: auth.isAuth ? AuthScreen() : TabsScreen(),
    

    【讨论】:

    • 当用户注销时,我想重定向到登录屏幕。但我正在使用 pushReplacement,所以 Navigator.pop 将不起作用。请有其他建议
    • 我目前在我的应用程序中使用它,它还具有 Firebase 身份验证功能,并且可以以提供的方式完美使用它。您必须确保检查它,例如在 main.dart 文件中。哦,顺便说一句,还要确保您的注销是异步的,还要使用等待,这可能会导致您遇到的问题。不客气!
    猜你喜欢
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2020-09-28
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 2021-08-22
    相关资源
    最近更新 更多