NoSuchMethodError: метод 'ancestorStateOfType' был вызван с нулевым значением - PullRequest
0 голосов
/ 01 сентября 2018

Я делаю изменения экрана, как это в списке 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)

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Проблема : неверный контекст передан дочернему виджету.

Решение : После передачи контекста метода Build, который был правильным контекстом для передачи дочернему виджету, моя проблема была решена.

0 голосов
/ 01 сентября 2018

Ваш виджет, скорее всего, был удален из дерева. Поэтому у него больше нет 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();
  }
}
...