問題タブ [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.

0 投票する
2 に答える
2030 参照

flutter - TabBar と ChangeNotifierProvider に関する厄介な問題

このようなシナリオを想像してください。

例: さまざまなジャンルの映画がたくさんあります。アイデアは TabBar であり、各タブにはジャンルのリスト ムービーが含まれています。この場合、 a ChangeNotifieregMoviesBlocはニーズにほぼ適合し、 とChangeNotifierは何の関係もありませんGenre。すべての TabBarView の子では、各タブが独自の状態ChangeNotifierProvider.valueを保持する必要があるため、ここでの使用は間違っています。そのため、ジャンルごとに を提供し、それを聞くために を提供します。というラッパークラスに入れました。MoviesBlocChangeNotifierProviderMoviesBlocConsumerMoviesBlocView

結果: - 各タブを順番にスワイプすると、エラーは発生しません。- 多数のタブをスワイプする場合。ChangeNotifier例: 突然最初のタブから最後のタブ (例: 20 個のタブがある) まで、コンソールは、各タブが個別に個別に作成されているにもかかわらず、破棄された再利用について不平を言いますChangeNotifier

再現コード

movies_bloc.dart

movies_bloc_view.dart

main.dart

更新

  1. wrapper を使用すると、作成時MoviesBlocViewに呼び出すかどうかに関係なく、コンソールは引き続き文句を言いますgetMoviesWithGenreMoviesBloc
  1. を使用しない場合MoviesBlocView
    • getMoviesWithGenreコンソールは、MoviesBloc作成時に呼び出そうとすると文句を言います。今では別のエラーログがあるのは奇妙です
  • 作成時に呼び出さなくてもエラーは発生しませんが、そのようなカスケードgetMoviesWithGenre行わないと、作成時にリクエストをフェッチするなどの方法がわからないため、意味がありませんMoviesBloc

どんな助けでも大歓迎です!

アップデート

いくつかのデバッグの後、TabBar の奇妙な動作が原因であることがわかりました。最も近い選択されたタブも事前にロードしてから、同じタブで1回ではなく2回続けて破棄しようとします。

レミが指摘したようにMoviesBloc、この検証を正常に機能するように追加した後、破棄されているときにnotifyListeners()を呼び出さないことを確認する必要がありMoviesBlocます

しかし、これはMoviesBloc作成時に関数を呼び出すため、関数が破棄された後に関数が呼び出されるとは決して想像できないため、期待した動作ではありません。

この時点で、TabBar と TabBarView がどうなっているのか本当にわかりません。なぜTabBarがそれを行うのかを誰かが説明できれば、私は非常に感謝しています!