At the outset, big thanks for sharing the library which helped me to simplify the state management. I wonder whether I am following the right way to rebuild FutureViewModel.
My initial view has a text field (for the user to enter search string) and a text that represent the search result.
class SearchFutureView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ViewModelBuilder<SearchFutureViewModel>.reactive(
builder: (context, viewModel, child) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(30.0),
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
_StringForm(),
FutureExampleView(
searchString: viewModel.searchText ?? 'Yet to initiate the search',
),
],
),
),
);
},
viewModelBuilder: () => SearchFutureViewModel(),
);
}
}
class _StringForm extends HookViewModelWidget<SearchFutureViewModel> {
_StringForm({Key key}) : super(key: key, reactive: false);
@override
Widget buildViewModelWidget(BuildContext context, SearchFutureViewModel viewModel) {
var text = useTextEditingController();
return TextField(
controller: text,
onSubmitted: (value) {
viewModel.updateSearchText(value);
}
);
}
}
class SearchFutureViewModel extends BaseViewModel {
String _searchText;
String get searchText => _searchText;
void updateSearchText(String value) {
_searchText = value;
notifyListeners();
}
}
class FutureExampleView extends StatelessWidget {
final String searchString;
const FutureExampleView({Key key, this.searchString}) : super(key: key);
@override
Widget build(BuildContext context) {
return ViewModelBuilder<FutureExampleViewModel>.reactive(
builder: (context, viewModel, child) {
return Expanded(
child: viewModel.hasError
? Container(color: Colors.red)
: Center(
child: viewModel.isBusy ? CircularProgressIndicator() : Text(viewModel.data),
),
);
},
viewModelBuilder: () => FutureExampleViewModel(searchString),
);
}
}
class FutureExampleViewModel extends FutureViewModel<String> {
final _dialogService = locator<DialogService>();
final String sampleData ;
FutureExampleViewModel(this.sampleData);
Future<String> getDataFromServer() async {
await Future.delayed(Duration(seconds: 3));
return sampleData;
}
@override
Future<String> futureToRun() => getDataFromServer();
@override
void onError(error) {
_dialogService.showDialog(
title: 'Error with Future',
description: error.toString(),
);
super.onError(error);
}
@override
void dispose() {
print('FutureExampleViewModel is getting disposed');
super.dispose();
}
}
Thanks for looking into this.