问题描述
我遇到一个问题,我想用一些不同的提供程序创建一个MultiProvider
,问题是其中两个是StreamProviders,它们需要首先具有Firebase身份验证登录名,然后在其中订阅一个Stream基于用户登录结果的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
有没有办法声明StreamProvider
并稍后在我的代码中订阅它?
预先感谢
解决方法
在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
...
}
...