ConsumerWidget и ref.watch
Часть раздела Управление состоянием путешествия по Flutter на Coddy. Урок 17 из 27.
Любой виджет может прочитать значение провайдера, если у него есть ref. Чтобы передать его, измените две вещи:
extends StatelessWidgetзаменяется наextends ConsumerWidget.- В
buildдобавляется второй параметр —WidgetRef ref.
class CityName extends ConsumerWidget {
const CityName({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final city = ref.watch(cityProvider);
return Text(city);
}
}ref.watch(cityProvider) возвращает значение провайдера — в данном случае текст Lisbon — и повторно строит виджет при каждом изменении этого значения. Без ref.watch cityProvider — это только сам провайдер, а не его значение.
Каждый виджет, которому нужно значение, запрашивает его таким образом, где бы он ни находился. Ничего не передаётся через конструкторы, и для поиска значения не нужен context.
Задание
ЛегкоCityName и Temperature показывают заглушки. Сделайте так, чтобы они читали провайдеры в начале файла:
- Преобразуйте оба виджета в
ConsumerWidget. CityNameотображает значениеcityProvider.Temperatureотображает значениеtemperatureProvider, за которым следует°C, и сохраняет тот же размер.
Попробуйте сами
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final cityProvider = Provider((ref) => 'Lisbon');
final temperatureProvider = Provider((ref) => 21);
void main() {
runApp(const ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: const CityName()),
body: const Center(child: Temperature()),
),
);
}
}
class CityName extends StatelessWidget {
const CityName({super.key});
@override
Widget build(BuildContext context) {
return const Text('City');
}
}
class Temperature extends StatelessWidget {
const Temperature({super.key});
@override
Widget build(BuildContext context) {
return const Text('0°C', style: TextStyle(fontSize: 64));
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Управление состоянием
1Поднятие состояния
Передача состояния дочернему компонентуПередача callback-функции дочернему компонентуCallback-функции, передающие значениеПоднятие состояния4Riverpod
Riverpod: ProviderScopeConsumerWidget и ref.watchRiverpod: StateProviderRiverpod: NotifierПровайдеры, отслеживающие другие провайдерыВыбор места хранения состоянияПотренируйтесь самостоятельно: Онлайн-компилятор Flutter