我有一个问题想要与其他不同的提供程序一起创建MultiProvider
,问题是其中两个是StreamProviders,它们需要首先具有firebase身份登录,然后根据的结果在firebase中订阅Stream用户登录。
因此,如果我无法在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
...
}
...