4

私は映画のリストを表すウィジェットを持っています。私のモデルには、ネットワーク要求から映画のリストを取得する getMovies() 関数があります。

enum MovieListState { IDLE, LOADING, ERROR }

class MovieListModel extends ChangeNotifier {
  MovieListModel(this._client);

  GatewayClient _client;

  MovieListState _viewState = MovieListState.LOADING;

  MovieListState get viewState => _viewState;

  set viewState(MovieListState value) {
    _viewState = value;
    notifyListeners();
  }

  Future<List<Movie>> getMovies() async {
    try {
      viewState = MovieListState.LOADING;
      var movies = await _client.getMovies();
      viewState = MovieListState.IDLE;
      return movies;
    } on KoException catch (e) {
      viewState = MovieListState.ERROR;
      throw e;
    }
  }
}

次に、ウィジェットから、リクエストの状態に基づいてレイアウトを作成します。

@override
  Widget build(BuildContext context) {
    state = Provider.of<AppState>(context);
    var model = MovieListModel(Provider.of<GatewayClient>(context));

    return ChangeNotifierProvider<MovieListModel>.value(
        value: model,
        child: Consumer<MovieListModel>(builder: (context, model, child) {
          if (model.viewState == MovieListState.IDLE) {
            return _getList(); // Method which generates the content with the retrieved values
          } else if (model.viewState == MovieListState.LOADING) {
            return Center(
              child: CircularProgressIndicator(),
            );
          } else {
            return Center(
              child: Text(_static.translate(context).movieListError),
            );
          }
        }));
  }

問題は、ウィジェットの初期化の最初にネットワーク呼び出し getMovies() をトリガーするにはどうすればよいですか? 別のポイントで getMovies() メソッドを手動で呼び出そうとしましたが、エラーが発生したか、ウィジェットが build() メソッドを呼び出すたびに呼び出しが繰り返されています。

前もって感謝します。

4

1 に答える 1

0

FutureProvider を使用して修正:

  @override
  Widget build(BuildContext context) {
    return FutureProvider<List<Movie>>.value(
      value: _model.getMovies(),
      initialData: List<Movie>(),
      catchError: (context, error) {
        return null;
      },
      child: Consumer<List<Movie>>(
        builder: (context, data, widget) {
          // ...
        },
      ),
    );
  }
于 2019-08-16T10:22:09.147 に答える