Riverpod FutureProvider обеспечивает внедрение зависимостей AsyncValue, что невозможно
У меня абстрактный класс
LectureRepository
реализовано.
LectureRepositoryImpl
инициализирует
SharedPreferences sharedPreferences
с участием
LectureLocalDataSourceImpl({@required this.sharedPreferences})
Теперь я хочу использовать Riverpod для доступа к репозиторию, поэтому делаю:
FutureProvider<LectureLocalDataSource>(
(ref) async {
return LectureLocalDataSourceImpl(sharedPreferences: await SharedPreferences.getInstance());
},
);
но теперь в
lectureRepositoryProvider
, когда я читал
lectureLocalDataRepositoryProvider
Я получаю AsyncValue в значении
localDataSource
, который я не могу назначить здесь:
final lectureRepositoryProvider = FutureProvider<LectureRepository>((ref) async {
final localDataSource = ref.read(lectureLocalDataRepositoryProvider);
return LectureRepositoryImpl(localDataSource: localDataSource);
});
Как мне обрабатывать AsyncValue?
2 ответа
Я сделал, если так работает, для темы, устойчивой с
SharedPreferences
:
final sharedPreferences =
FutureProvider((ref) => SharedPreferences.getInstance());
final themeChangeNotifier = ChangeNotifierProvider<ThemeChangeNotifier>((ref) {
final prefs = ref.watch(sharedPreferences)?.data?.value;
return ThemeChangeNotifier(prefs);
});
и используйте это так:
final isDartTheme = watch(themeChangeNotifier).isDarkTheme;
final prefs = watch(sharedPreferences);
return prefs.when(
loading: () => Material(
child: CircularProgressIndicator(),
),
data: (_) => MaterialApp(
title: 'Flutter Demo',
theme: isDartTheme ? ThemeData.dark() : ThemeData.light(),
home: SearchPage(),
),
error: (_, __) => SizedBox.shrink(),
);
Надеюсь, через пару дней опубликую видео и репо :)
Вы можете позвонить
.data
на AsyncValue, который дает вам базовое значение данных. Если вам нужно различать загрузку, данные и ошибку, документ AsyncValue объяснит, как это сделать.