NoSuchMethodError: метод 'ancestorStateOfType' был вызван с нулевым значением
Я делаю изменение экрана как этот список i am для потока, и когда он излучает, я меняю экран
@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();
}
}
Проблема: это был неправильный контекст, переданный дочернему виджету.
Решение: после передачи контекста метода Build, который был правильным контекстом для передачи дочернему виджету, моя проблема была решена.