【问题标题】:NoSuchMethodError: The method 'ancestorStateOfType' was called on nullNoSuchMethodError:方法 'ancestorStateOfType' 在 null 上被调用
【发布时间】:2019-02-07 09:11:53
【问题描述】:

我正在为流做这样的 iam 列表更改屏幕,当它发出时我更改屏幕

 @override
 void initState() {
    super.initState();

     appBloc.error.listen((data) {
     _scaffoldKey.currentState.showSnackBar(new SnackBar(content: new 
        Text(data)));
    });

     appBloc.success.listen((_) => goToDashBoardScreen(context));

}

doToDashBoardScreen 看起来像这样

Navigator.pushReplacement(context, new SlideRightRoute(widget: 
DashBoardScreen()));

但我收到这样的错误,但我更改了页面。

22:05:02.446 3 info flutter.tools E/flutter (13216): NoSuchMethodError: 
The method 'ancestorStateOfType' was called on null.
22:05:02.446 4 info flutter.tools E/flutter (13216): Receiver: null
22:05:02.446 5 info flutter.tools E/flutter (13216): Tried calling: 
ancestorStateOfType(Instance of 'TypeMatcher<NavigatorState>')
22:05:02.446 6 info flutter.tools E/flutter (13216): #0      
Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:48:5)
22:05:02.446 7 info flutter.tools E/flutter (13216): #1      
Navigator.of (package:flutter/src/widgets/navigator.dart:1270:19)
22:05:02.446 8 info flutter.tools E/flutter (13216): #2      
Navigator.pushReplacement 
(package:flutter/src/widgets/navigator.dart:952:22)

【问题讨论】:

    标签: dart flutter dart-2


    【解决方案1】:

    您的小部件很可能已从树中删除。因此它不再有context

    问题是,您忘记取消订阅您的Stream。因此,即使从树中删除,您的小部件仍会尝试更新。

    解决方案是取消订阅dispose 电话:

    class Foo extends StatefulWidget {
      @override
      _FooState createState() => _FooState();
    }
    
    class _FooState extends State<Foo> {
      StreamSubscription streamSubscription;
    
      @override
      void initState() {
        super.initState();
    
        streamSubscription = Bloc.of(context).myStream.listen((value) {
          print(value);
        });
      }
    
      @override
      void dispose() {
        streamSubscription.cancel();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    【讨论】:

    • 是的,它解决了问题!谢谢。我想知道 didChangeDependencies 会解决它,但它没有。何时使用 initState 与 didChangeDependencies ??
    • 你知道如何解决吗? stackoverflow.com/questions/62097660/…
    【解决方案2】:

    问题:传递给子小部件的上下文是错误的。

    解决方案:在传递 Build 方法上下文后,该上下文是传递给子小部件的正确上下文,我的问题得到解决。

    【讨论】:

      猜你喜欢
      • 2019-10-15
      • 2020-07-13
      • 2021-10-25
      • 2020-10-12
      • 2020-04-09
      • 2019-12-26
      • 2020-09-25
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多