# Flutter Mobx
- https://mobx.pub
## pubspec.yaml
dependencies:
mobx: ^0.3.8
flutter_mobx: ^0.3.3
provider: ^3.1.0
dev_dependencies:
build_runner: ^1.3.1
mobx_codegen: ^0.3.9
## 명령어
flutter packages pub run build_runner build
flutter packages pub run build_runner watch
## count_store.dart
import 'package:mobx/mobx.dart';
// Include generated file
part 'counter_store.g.dart';
// This is the class used by rest of your codebase
class CounterStore = _CounterStore with _$CounterStore;
// The store-class
abstract class _CounterStore with Store {
@observable
int value = 0;
@action
void increment() {
value++;
}
}
## App
import 'store/counter_store.dart';
import 'store/search_store.dart';
void main() => runApp(App());
class App extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
Provider(builder: (_) => CounterStore()),
Provider(builder: (_) => SearchStore()),
],
child: MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.green,
backgroundColor: Colors.grey,
),
home: HomeScreen(),
// home: SearchResultScreen(),
));
}
}
## Widget
final searchStore = Provider.of(context);
Observer(
builder: (context) => Text('${searchStore.state}'),
),
onPressed: () {
searchStore.search('FIX ME!!!!');
},
## Mobx Reaction
- https://stackoverflow.com/questions/56412277/how-to-pop-screen-using-mobx-in-flutter
final List _disposers = [];
bool _pushed = false;
@override
void dispose() {
_disposers.forEach((disposer) => disposer());
super.dispose();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
searchStore = Provider.of(context);
_disposers.add(
autorun(
(_) {
// print('${searchStore.state}');
},
),
);
_disposers.add(
reaction(
(_) => searchStore.finished,
(_) {
print('## reaction called');
if (_pushed == false) {
_pushed = true;
print('pushed is $_pushed');
searchStore.setStateInit();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
SearchResultScreen(onWillPop: _onWillPop)),
);
}
},
),
);
}