我有一个问题想要与其他不同的提供程序一起创建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
      ...
    }
...

10-06 13:39