私はストリームのこの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)
ウィジェットがツリーから削除された可能性があります。したがって、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();
}
}
問題:子ウィジェットに渡されたコンテキストが間違っていました。
ソリューション:子ウィジェットに渡す正しいコンテキストであるビルドメソッドコンテキストを渡した後、私の問題は解決されました。