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

Mig*_*vez 4 dart flutter flutter-provider

我有一个问题,我想MultiProvider用一些不同的提供程序创建一个,问题是其中两个是 StreamProvider,首先需要进行 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(
...
}
Run Code Online (Sandbox Code Playgroud)

对于Globals.firebaseCaller.settings()并且Globals.firebaseCaller.plans()我使用注册用户uid

有没有办法声明 aStreamProvider并稍后在我的代码中订阅它?

提前致谢

小智 10

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()
..
Run Code Online (Sandbox Code Playgroud)

然后在 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
      ...
    }
...
Run Code Online (Sandbox Code Playgroud)