NoSuchMethodError:方法 'ancestorStateOfType' 在 null 上被调用

Posted

技术标签:

【中文标题】NoSuchMethodError:方法 \'ancestorStateOfType\' 在 null 上被调用【英文标题】: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)

【问题讨论】:

【参考方案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 ?? 你知道如何解决吗? ***.com/questions/62097660/…【参考方案2】:

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

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

【讨论】:

以上是关于NoSuchMethodError:方法 'ancestorStateOfType' 在 null 上被调用的主要内容,如果未能解决你的问题,请参考以下文章

未处理的异常:NoSuchMethodError:类“RemoteMessage”没有实例方法“[]”

使用 TextView 方法获取 NoSuchMethodError

颤振和json:NoSuchMethodError:方法'[]'在null上被调用

java.lang.NoSuchMethodError:没有虚拟方法 getParentFragmentManager()

NoSuchMethodError:在 null 上调用了方法 '[]' - Flutter

Firebase 身份验证,错误:NoSuchMethodError:在 null 上调用了方法“登录”