setState() 없이 상태값을 변경
영향을 미치는 범위는 ValueListenableBuilder() 내에서만 허용
전체 위젯에 값을 적용하기 위해서는 setState()를 사용해야하는데 build가 완료되기 전에 setState()를 호출하게 된다면 오류가 발생
ValueListenableBuilder(
valueListenable: _controller,
builder: (context, value, child) {
return Text('$value'); // 값이 변경됨
},
),
Text('other text : ${_controller.value}'), // 값이 변경하지 않음
Provider.of(context) // 상태 구독
notifyListeners() // 상태 변경
class CounterState {
final int count;
CounterState(this.count);
}final counterProvider = StateNotifierProvider<CounterNotifier, CounterState>((ref) {
return CounterNotifier();
});
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() {
runApp(
ProviderScope(
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('StateNotifier Example')),
body: Center(
child: CounterText(),
),
floatingActionButton: CounterButton(),
),
);
}
}
class CounterText extends ConsumerWidget {
Widget build(BuildContext context, ScopedReader watch) {
final counterState = watch(counterProvider);
return Text(
'${counterState.count}',
style: Theme.of(context).textTheme.headline4,
);
}
}
class CounterButton extends ConsumerWidget {
Widget build(BuildContext context, ScopedReader watch) {
final counterNotifier = watch(counterProvider.notifier);
return FloatingActionButton(
onPressed: () {
counterNotifier.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
);
}
}