gpt4 book ai didi

dart - StreamBuilder 限制

转载 作者:行者123 更新时间:2023-12-03 02:47:52 29 4
gpt4 key购买 nike

StreamBuilder每当它获得新事件时都会重建。这会导致导航( Navigator.push )出现问题,因为如果在导航时接收到新事件,则此触发器重建。因为在构建小部件树时尝试导航,这将抛出 error .

not possible to prevent rebuild根据需要避免此问题。

建议的解决方法基本上来自 cache .
还:
here
here

但这意味着如果还想从列表上的卡片提供导航,则不能拥有不断更新的 StreamBuilder 构建列表。例如在卡片 onPressed() . See here .

所以刷新数据必须使用pull来刷新……

有人有更好的解决方案吗?
或者 Flutter 团队是否正在努力解决这个限制,例如,如果用户点击卡片,则允许阻止重建?

更新:

TL;DR 是否是拉动刷新更新数据的唯一方法,因为必须缓存 StreamBuilder 中的流以防止每次收到新事件时重建?

更新 2:

我尝试实现缓存数据,但我的代码不起作用:

Stream<QuerySnapshot> infoSnapshot;

fetchSnapshot() {
Stream<QuerySnapshot> infoSnapshot = Firestore.instance.collection(‘info’).where(‘available’, isEqualTo: true).snapshots();
return infoSnapshot;
}


@override
void initState() {
super.initState();
fetchSnapshot();
}

...
child: StreamBuilder(
stream: infoSnapshot,
builder: (context, snapshot) {

if(snapshot.hasData) {
return ListView.builder(
itemBuilder: (context, index) =>
build(context, snapshot.data.documents[index]),
itemCount: snapshot.data.documents.length,
);
} else {
return _emptyStateWidget();
}

更新 3:

我已经尝试使用 StreamController但不能正确执行:
Stream<QuerySnapshot> infoStream;
StreamController<QuerySnapshot> infoStreamController = StreamController<QuerySnapshot>();

@override
void initState() {
super.initState();

infoStream = Firestore.instance.collection(‘info’).where(‘available’, isEqualTo: true).snapshots();
infoStreamController.addStream(infoStream);
}


child: StreamBuilder(
stream: infoStreamController.stream,
builder: (context, snapshot) {

更新 4:

使用建议 _localStreamController给出错误:
StreamController<QuerySnapshot> _localStreamController = StreamController<QuerySnapshot>();

@override
void initState() {
super.initState();

Firestore.instance.collection(‘info’).snapshots().listen((QuerySnapshot querySnapshot) {

// if(userAdded == null) {
_localStreamController.add(querySnapshot);
// }

});
...
child: StreamBuilder(
stream: _localStreamController.stream,
builder: (context, snapshot) {

The getter 'stream' was called on null.

The method 'add' was called on null.

最佳答案

根据您上面的评论,实际问题似乎是在您使用流导航离开 View 后崩溃。您必须:

  • 当您离开时取消您的流 Controller ,以便它不再监听任何事件。
  • 或者只是不要在导航后通过流发出任何新值。添加暂停,直到您返回 View

  • 更新:添加带有伪示例的代码
    class Widget {
    // Your local stream
    Stream<String> _localStream;
    // Value to indicate if you have navigated away
    bool hasNavigated = false;
    ...
    void init() {
    // subscribe to the firebase stream
    firebaseStream...listen((value){
    // If this value is still false then emit the same value to the localStream
    if(!hasNavigated) {
    _localStream.add(value);
    }
    });
    }

    Widget build() {
    return StreamBuilder(
    // subscribe to the local stream NOT the firebase stream
    stream: _localStream,
    // handle the same way as you were before
    builder: (context, snapshot) {
    return YourWidgets();
    }
    );
    }
    }

    关于dart - StreamBuilder 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54911256/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com