Flutter如何创建StreamProvider并稍后订阅 [英] How to create a StreamProvider and subscribe to it later, Flutter

查看:81
本文介绍了Flutter如何创建StreamProvider并稍后订阅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到一个问题,我想用一些不同的提供程序创建一个 MultiProvider ,问题是其中两个是StreamProviders,它们需要首先具有Firebase身份验证登录名,然后再订阅根据用户登录的结果在Firebase中创建一个Stream.

I have an issue where I want to create a MultiProvider with some different providers, the problem is that two of those are StreamProviders that require first to have a firebase auth login, and after that subscribe to a Stream in firebase based on the result of the user logged in.

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

So if I cannot launch the StreamProvider before the login at the top of my MaterialApp.

如果我在登录完成后声明了这些提供程序,则会收到一条错误消息,指出该提供程序不在正确的路由上,因为我需要围绕我的所有应用程序使用多条路由中的数据.

If I declare those providers after the login is complete I get an error that the provider is not on the correct route because I need the data in several routes around all my app.

这是我的代码:

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

For Globals.firebaseCaller.settings() and Globals.firebaseCaller.plans() I use the register user uid

有没有一种方法可以声明一个 StreamProvider 并稍后在我的代码上进行订阅?

Is there a way to declare a StreamProvider and subscribe to it later on my code?

预先感谢

推荐答案

StreamProvider 中使用 create 参数传递您的流并使用 Provider对其进行订阅.of< T>(上下文)

Use create parameter in the StreamProvider to pass your stream and subscribe to it using 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()

then in the 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
      ...
    }
...

这篇关于Flutter如何创建StreamProvider并稍后订阅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆