未处理的异常:查找停用的小部件的祖先是不安全的-Flutter

时间:2020-08-19 08:28:31

标签: firebase flutter authentication dart firebase-authentication

以前有人遇到过这个问题吗?

E/flutter (12975): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter (12975): At this point the state of the widget's element tree is no longer stable.
E/flutter (12975): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

在谷歌搜索时,我发现它与context有关吗?这就是为什么我通过函数的参数传递上下文

下面是代码


class CustRegView extends StatefulWidget {
  @override
  _CustRegViewState createState() => _CustRegViewState();
}

class CustRegView extends StatelessWidget{
  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    final deviceSize = MediaQuery.of(context).size;
    return BaseView<CustRegViewModel>( 
          builder: (context, model, child) => Scaffold(
    
    ...<some code>
    
    FlatButton (
        onPressed: () async {
            var registerSuccess = await model.register( _controller.text);   

            if (registerSuccess) {
                Navigator.pushNamed(context, 'newScreen'); <--- E R R O R    H E R E            } else {
                UIHelper().showErrorButtomSheet(context, model.errorMessage);
            }
    )
}

CustRegViewModel看起来像这样

 class CustRegViewModel extends BaseViewModel {
    
    final AuthService _authService = locator<AuthService>();
    final DialogService _dialogService = locator<DialogService>();
    dynamic verifiedUserID ; 


    Future<bool> register(String phoneNo) async {
        verifiedUserID = await verifyPhone(updatedPhoneNo);
        return    verifiedUserID != null ? true :  false;  // From here it 
                                                           // returns true
    }

    Future<void> verifyPhone(phoneNo) async {
        var completer = Completer<dynamic>();
            await FirebaseAuth.instance.verifyPhoneNumber(
                    phoneNumber: updatedPhoneNo,
                    timeout: Duration(seconds: 50),
                    verificationCompleted: (AuthCredential authCred) async {...... <some code>
                    verificationFailed: (AuthException authException) {...... <some code>
                    codeSent: (String verID, [int forceCodeResend]) async {...... <some code>
                    codeAutoRetrievalTimeout: (String verID) {...
             ).catchError((error) {...... <some code>
       return completer.future;    
       }
}

main类看起来像这样

void main() {
  setupLocator();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  final GlobalKey<NavigatorState> navigatorKey =
      new GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return StreamProvider<User>(
      initialData: User.initial(),
      create: (BuildContext context) => locator<AuthService>().user,
      child: MaterialApp(
   
        builder: (context, widget) => Navigator(
          onGenerateRoute: (settings) => MaterialPageRoute(
            builder: (context) => DialogManager(
              child: widget,
            ),
          ),
        ),

        title: 'Fitness Diet',
        theme: ThemeData(),
        initialRoute: 'splash',
        navigatorKey: navigatorKey,
        onGenerateRoute: Router.generateRoute,
      ),
    );
  }
}

0 个答案:

没有答案