如何从 RealmResults 获取 Flutter Stream?

问题描述 投票:0回答:1

我创建了 Realm 对象并将其连接到 MongoDB Atlas。

在 Flutter StreamBuilder 小部件中,流参数将 RealmResults.changes 作为流并且可以工作。

StreamBuilder<MyObject>(
        stream: RealmResults.changes, //works
        builder: (context, snapshot) => ()
),

但是如果使用 StreamProvider,需要流的 create 参数不接受 RealmResults.changes 作为流。

StreamProvider<MyObject>(
        initialData: MyObject(),
        create: (context) => RealmResults.changes, //error
        child: Scaffold()
)

此处以红色未划线显示的错误是: 根据闭包上下文的要求,返回类型“Stream>”不是“Stream?”。 我很困惑,谁能帮助我。谢谢

flutter realm stream-builder stream-provider
1个回答
1
投票

该错误表明流的预期返回类型与创建参数中闭包所需的类型不匹配。

出现错误是因为

RealmResults.changes
返回
Stream<RealmResultsChanges<MyObject>>
,但
StreamProvider
中的创建参数需要
Stream<MyObject>

要解决此问题,您需要将从

RealmResults.changes
获得的流转换为
MyObject
的流。您可以使用映射方法从更改流中提取必要的数据来实现此目的。

以下是如何执行此操作的示例:

StreamProvider<MyObject>(
  initialData: MyObject(),
  create: (context) {
    // Replace MyObject with your actual object type
    final Realm realm = Realm(); // Assuming you have the realm instance
    final results = realm.objects<MyObject>(); // Replace with your MyObject type

    // Transform the changes stream to a stream of MyObject
    return results.changes.map((changes) {
      // Extract the latest MyObject from changes
      // For example, if you're interested in the first change:
      if (changes.inserted.isNotEmpty) {
        return results[changes.inserted.first];
      } else if (changes.modified.isNotEmpty) {
        return results[changes.modified.first];
      } else {
        // Handle other change types (deletions, etc.) or return a default value
        return MyObject(); // Return a default object if needed
      }
    });
  },
  child: Scaffold(),
)

MyObject
替换为您的实际对象类型,并调整映射内的逻辑以满足您从更改流中检索更新对象的特定要求。

通过这种方式,您可以将更改流从

Realm
转换为所需对象类型
(MyObject)
的流,使其与
StreamProvider
的期望兼容。

© www.soinside.com 2019 - 2024. All rights reserved.