私は映画のリストを表すウィジェットを持っています。私のモデルには、ネットワーク要求から映画のリストを取得する 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() メソッドを呼び出すたびに呼び出しが繰り返されています。
前もって感謝します。