問題タブ [flutter-change-notifier]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
flutter - TabBar と ChangeNotifierProvider に関する厄介な問題
このようなシナリオを想像してください。
例: さまざまなジャンルの映画がたくさんあります。アイデアは TabBar であり、各タブにはジャンルのリスト ムービーが含まれています。この場合、 a ChangeNotifier
egMoviesBloc
はニーズにほぼ適合し、 とChangeNotifier
は何の関係もありませんGenre
。すべての TabBarView の子では、各タブが独自の状態ChangeNotifierProvider.value
を保持する必要があるため、ここでの使用は間違っています。そのため、ジャンルごとに を提供し、それを聞くために を提供します。というラッパークラスに入れました。MoviesBloc
ChangeNotifierProvider
MoviesBloc
Consumer
MoviesBlocView
結果: - 各タブを順番にスワイプすると、エラーは発生しません。- 多数のタブをスワイプする場合。ChangeNotifier
例: 突然最初のタブから最後のタブ (例: 20 個のタブがある) まで、コンソールは、各タブが個別に個別に作成されているにもかかわらず、破棄された再利用について不平を言いますChangeNotifier
。
再現コード
movies_bloc.dart
movies_bloc_view.dart
main.dart
更新:
- wrapper を使用すると、作成時
MoviesBlocView
に呼び出すかどうかに関係なく、コンソールは引き続き文句を言いますgetMoviesWithGenre
MoviesBloc
- を使用しない場合
MoviesBlocView
、getMoviesWithGenre
コンソールは、MoviesBloc
作成時に呼び出そうとすると文句を言います。今では別のエラーログがあるのは奇妙です
- 作成時に呼び出さなくてもエラーは発生しませんが、そのようなカスケード
getMoviesWithGenre
を行わないと、作成時にリクエストをフェッチするなどの方法がわからないため、意味がありません。MoviesBloc
どんな助けでも大歓迎です!
アップデート
いくつかのデバッグの後、TabBar の奇妙な動作が原因であることがわかりました。最も近い選択されたタブも事前にロードしてから、同じタブで1回ではなく2回続けて破棄しようとします。
レミが指摘したようにMoviesBloc
、この検証を正常に機能するように追加した後、破棄されているときにnotifyListeners()を呼び出さないことを確認する必要がありMoviesBloc
ます
しかし、これはMoviesBloc
作成時に関数を呼び出すため、関数が破棄された後に関数が呼び出されるとは決して想像できないため、期待した動作ではありません。
この時点で、TabBar と TabBarView がどうなっているのか本当にわかりません。なぜTabBarがそれを行うのかを誰かが説明できれば、私は非常に感謝しています!