如何创建一个 StreamProvider 并稍后订阅它,Flutter

How to create a StreamProvider and subscribe to it later, Flutter

我有一个问题,我想创建一个 MultiProvider 与一些不同的提供者,问题是其中两个是 StreamProviders,需要首先有一个 firebase 身份验证登录,然后订阅一个根据用户登录的结果在 firebase 中流式传输。

因此,如果我无法在 MaterialApp 顶部登录之前启动 StreamProvider

如果我在登录完成后声明这些提供者,我会收到一个错误,指出提供者不在正确的路线上,因为我需要围绕我的所有应用程序的多条路线中的数据。

这是我的代码:

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 并稍后订阅它?

提前致谢

StreamProvider 中使用 create 参数传递您的流并使用 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
      ...
    }
...