例如,我试图一次获取为多个流发出的数据,但是有2个或更多的这些流发出相同类型的数据,比方说一个字符串.

我的问题是,是否可以使用MultiProvider并使用同一类型的多个StreamProvider(或任何提供程序,但我对此 case 感兴趣),同时仍然能够访问每个提供程序发出的数据?

解决这个问题的一种方法是在使用普通数据类型时使用StreamBuilder,但我真的很喜欢MultiProvider提供的更干净的代码.

例子:

class MyScreen extends StatelessWidget {
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<String>(stream: Observable.just("stream1")),
        StreamProvider<String>(stream: Observable.just("stream2")),
        StreamProvider<String>(stream: Observable.just("stream3"))
      ],
      child: Builder(
        builder: (BuildContext context) {
          AsyncSnapshot<String> snapshot =
              Provider.of<AsyncSnapshot<String>>(context);
          String data = snapshot.data;
          return Text(data); 
        },
      ),
    );
  }
}

推荐答案

MultiProvider或不MultiProvider不会改变任何事.如果两个提供程序共享同一类型,则最深的一个将覆盖该值.

不可能从不是给定类型最接近祖先的提供程序获取值.

如果需要单独访问所有这些值,则每个值都应该有唯一的类型.

例如,而不是:

Provider<int>(
  value: 42,
  child: Provider<int>(
    value: 84,
    child: <something>
  ),
)

您可以执行以下操作:

class Root {
  Root(this.value);

  final int value;
}

class Leaf {
  Leaf(this.value);

  final int value;
}


Provider<Root>(
  value: Root(42),
  child: Provider<Leaf>(
    value: Leaf(84),
    child: <something>
  ),
)

这允许使用以下方法独立获取每个值:

Provider.of<Root>(context)
Provider.of<Leaf>(context);

Dart相关问答推荐

空值判断运算符 - Flutter

Flutter 中带有导航栏的永久视图

Flutter 中的 authStateChanges

Flutter:[cloud_firestore/unknown] NoSuchMethodError:null 上的无效成员:'includeMetadataChanges'(Flutter Web)

LinearProgressIndicator Flutter使用

Flutter:并非所有本地化代表都支持应用程序的语言环境

使用where在对象列表中搜索 dart 中的特定对象

如何在Flatter dart中使用相同的元素初始化列表?

在 Dart 中使用带有 Future 的循环

如何从Flatter应用程序中导航到网页?(OAuth)

如何在 Dart 中替换字符串中间的空格?

无法使用 Flutter 调用 Localhost,将随机端口分配给 HTTP GET 调用

如何将整数中的ascii值转换为Flutter中的等效字符?

在 Dart 中将类类型作为变量传递

Dart:将十进制转换为十六进制

从 Dart 调用 javascript

Cancel stream onData

dart,overloading[] 运算符?

Dart 是否支持枚举?

如何比较 Dart 中的列表是否相等?