Flutter如何创建StreamProvider并在以后订阅

问题描述

我遇到一个问题,我想用一些不同的提供程序创建一个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
      ...
    }
...