#flutter #dart #flutter-provider
#flutter #dart #flutter-provider
Вопрос:
У меня проблема, когда я хочу создать MultiProvider
с несколькими разными провайдерами, проблема в том, что два из них являются потоковыми провайдерами, которым сначала требуется авторизоваться в firebase, а после этого подписаться на поток в firebase на основе результата входа пользователя в систему.
Итак, если я не могу запустить StreamProvider
перед входом в систему в верхней части моего MaterialApp
.
Если я объявляю этих поставщиков после завершения входа в систему, я получаю сообщение об ошибке, что поставщик не находится на правильном маршруте, потому что мне нужны данные по нескольким маршрутам для всего моего приложения.
Вот мой код:
class Neybor extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textTheme = GoogleFonts.nunito;
return MultiProvider(
providers: [
ChangeNotifierProvider<Data>(create: (context) => new Data()),
/// Settings Stream
StreamProvider<SettingsDataModel>.value(
value: Globals.firebaseCaller.settings(),
),
/// Plans Stream
StreamProvider<PlansDataModel>.value(
value: Globals.firebaseCaller.plans(),
),
],
child: MaterialApp(
...
}
Для Globals.firebaseCaller.settings()
и Globals.firebaseCaller.plans()
я использую пользовательский uid register
Есть ли способ объявить StreamProvider
и подписаться на него позже в моем коде?
Заранее спасибо
Комментарии:
1. Используйте конструктор по умолчанию вместо «.value»
Ответ №1:
Используйте create
параметр в StreamProvider
, чтобы передать свой поток и подписаться на него, используя Provider.of<T>(context)
class Neybor extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textTheme = GoogleFonts.nunito;
return MultiProvider(
providers: [
/// Settings Stream
/// Globals.firebaseCaller.settings() should returns a Stream<SettingsDataModel>
StreamProvider<SettingsDataModel>(create: (context) =>
Globals.firebaseCaller.settings(),
),
],
child: HomeView()
..
затем в HomeView()
import 'package:provider/provider.dart';
class HomeView extends StatelessWidget {
@override
Widget build(BuildContext context) {
SettingsDataModel settings = Provider.of<SettingsDataModel>(context);
if (settings == null) {
return Align(child: new CircularProgressIndicator());
} else {
// your code
...
}
...