[Flutter] 리버포드 블러셔 패치.
배경.
Riverpod를 상태 관리 플러그인으로 사용합니다.거의 쓸 수 있을 뻔했는데 (나이가 들어서인지 아니면 원래 기억력이 없어서) 세부 사항이 기억이 안 나요.그래서 이번 리버포드와 관련된 일람표를 만들고 싶습니다.테스트의 실현으로 Riverpod의 각 Provider에서 Fluter 템플릿의 상향 계수 응용을 실현하였다.간단하지만 참고할 만하다고 생각해요.각 Provider의 마지막 원본 파일에서 비행할 수 있습니다.
아는 사람을 위한 싸구려 티켓이기 때문에 더 자세한 설명을'책'으로 내놓고 싶다.
구현 환경
Riverpod에 파괴적인 변경이 발생했습니다. 발견되면 연락 주세요.대체로 주의하다
(추기)2021/11/05, 1.0.0 나왔습니다!나는 그것에 근거하여 수정했다.
flutter_riverpod: ^1.0.0
[√] Flutter (Channel stable, 2.5.3, on Microsoft Windows [Version 10.0.19043.1288], locale ja-JP)
[√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[√] Android Studio (version 2020.3)
미리 준비하다
flutter pub add flutter_riverpod
main.dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() {
- runApp(const MyApp());
+ runApp(ProviderScope(child: const MyApp()));
}
Provider
Provider 상수
Provider<String> _provider =
Provider((ref) => 'You have pushed the button this many times:');
Provider<String> _provider =
Provider((ref) => ref.watch(anotherProider).state * 2);
ref.watch(_provider)
수정
할 수 없다
사용 용도
상수에 쓰다.또한 다른 Provider의 값을 받아서 값을 표시할 수도 있습니다.
State Provider 변수
StateProvider<int> _stateProvider = StateProvider((ref) => 0);
ref.watch(_stateProvider)
뭘 써야 되지?
ref.read(_stateProvider.state).state++;
ref.read(_stateProvider.state).state = ref.read(_stateProvider) + 1;
ref.read(_stateProvider.state).update((state) => state + 1);
ref.read(_stateProvider.notifier).state++;
ref.read(_stateProvider.notifier).state = ref.read(_stateProvider) + 1;
ref.read(_stateProvider.notifier).update((state) => state + 1);
riverpod의 Provider에서 기본입니다.int 관리 클래스 등의 값입니다.
StateNotifier 변수 + 메서드
class CounterNotifier extends StateNotifier<int> {
CounterNotifier() : super(0);
void countUp() {
state++;
}
}
final _provider =
StateNotifierProvider<CounterNotifier, int>((ref) => CounterNotifier());
Text(
'${ref.watch(_provider)}',
style: Theme.of(context).textTheme.headline4,
),
ref.watch(_provider.notifier).countUp(),
방법이 있기 때문에 MVM 모델처럼 사용하는 방법이 있습니다.(개인적으로는 VM이 하나의 학급으로 독립하는 것이 좋다)
ChangeNotifierProvider
class Counter extends ChangeNotifier {
int _counter = 0;
get counter => _counter;
void countUp() {
_counter++;
notifyListeners();
}
}
final _provider = ChangeNotifierProvider((ref) => Counter());
ref.watch(_provider).counter
ref.watch(_provider).countUp()
ChangeNotifier 좋아하시는 분?개인적으로는 notify Listeners()를 쓰는 것을 잊어버려서 잘 못한다.
FutureProvier Future 사용
final _provider = FutureProvider<int>((ref) async {
final prefs = await SharedPreferences.getInstance();
return prefs.getInt(KEY) ?? 0;
});
Widget 반환
ref.watch(_provider).when(
data: (data) => Text(
'${ref.watch(_provider).value}',
style: Theme.of(context).textTheme.headline4,
),
loading: () => const CircularProgressIndicator(),
error: (error, stack) => Text('error'),
),
onPressed: () async {
final prefs = await SharedPreferences.getInstance();
int currentValue = prefs.getInt(KEY) ?? 0;
prefs.setInt(KEY, currentValue + 1);
ref.refresh(_provider);
},
퓨처형을 사용하기 때문에 Shared Preferences뿐만 아니라 웹API와 파일 읽기 등을 사용하는 경우도 많다.
StreamProvider Stream 사용
StreamController<int> streamController = StreamController();
final _provider = StreamProvider<int>((ref) {
if (streamController.hasListener) {
streamController = StreamController();
}
return streamController.stream;
});
Widget 반환
ref.watch(_provider).when(
data: (data) => Text(
'${ref.watch(_provider).value}',
style: Theme.of(context).textTheme.headline4,
),
loading: () => const CircularProgressIndicator(),
error: (error, stack) => Text('${error}'),
),
onPressed: () {
count++;
streamController.sink.add(count);
},
나는 Firestore에서 snaptshots를 사용하는 경우가 가장 쓸 수 있다고 생각한다.
표시된 Widget
Consumer
일반적인 Widget은 무릎 위 (이 경우 Text) 로 둘러싸인 Widget에 접근할 수 있습니다.Stateless Widget 또는 Stateful Widget의 Widget에서riverpod를 사용하고 싶을 때 사용합니다.
Consumer(
builder: (context, ref, child) => Text(
'${ref.watch(_stateProvider).state}',
style: Theme.of(context).textTheme.headline4,
),
)
출처 ConsumerWidget
StatelessWidget의 riverpod 버전입니다.riverpod를 전면적으로 사용하기 때문에 모든 Widget을 Consuumer로 둘러싸는 것이 어려운 상황에서 사용합니다.또는 riverpod 전용 Widget을 만드는 데 사용됩니다.
class MyHomePage extends ConsumerWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
Widget build(BuildContext context, WidgetRef ref) {
return Text(ref.watch(_provider));
}
}
출처 하면, 만약, 만약...
트위터에 잔소리를 하거나 블로그에 링크를 붙일 수 있다면 정말 기쁠 거예요!그리고 잘못된 지적과 사용용도에 대한 생각이 있으면 댓글로 남겨주세요!
더 자세히 공부하기 위해서.
부정행위 신청서를 전제로 하기 때문에 꼴찌 시 상태 관리 대상을 int로 한다.어떤 사람들은 데이터 클래스를 대상으로 웹API와Firestore에서 얻은 데이터를 리버포드로 처리하려고 한다.이 경우 다음 Udemy 워크숍을 사용하십시오.Riverpod의 기초부터 MVM모델의 응용까지 물론 웹API와Firestore에서 나온 데이터도 처리한다.꼭 들어주세요.
쿠폰 코드도 있으니 사용하세요.
Flutter x Riverpod x MVM으로 구현된 간단한 디자인
Reference
이 문제에 관하여([Flutter] 리버포드 블러셔 패치.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sakusin/articles/5715b1ed2d9761텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)