当键盘弹出或关闭时,streambuilder会一次又一次地重建

时间:2019-02-21 06:57:04

标签: dart flutter google-cloud-firestore

在这里我遇到了一个问题,我有一列小部件,当我尝试输入一些文本键盘弹出按钮时,其中有流生成器和一个文本字段,然后流生成器再次重建,或者当键盘也关闭时,流生成器也正在重建再次 当我建立聊天屏幕时,由于读取次数增加

,我不想再次重建流生成器

任何有帮助的建议。

3 个答案:

答案 0 :(得分:1)

  

Flutter每次想要更改时都会调用build()方法   视图中的任何内容,而且这种情况经常出奇地发生。

您可以将流传递到无状态窗口小部件

 MyApp({Key key, this.stream}) : super(key: key);

或如果小部件为全状态,则在initState方法中构建流。

@override
void initState() {
  super.initState();
  post = buildStream();
}

答案 1 :(得分:0)

我面临着同样的问题。我找不到简单的替代方法来避免在不更改大量代码的情况下重新渲染。所以我就这样结束了:

因此在Bloc类中,首先启动一个变量,说 streamStateIndex = 0; 而无论我在哪里使用 sink.add(data) ,我开始使用

streamStateIndex++;
sink.add({"data": data, "streamStateIndex":streamStateIndex});

并启动了另一个变量,让您在Stateful flutter类中说localStreamStateIndex = 0;来比较来自集团的streamStateIndex

并在StreamBuilder中这样使用:

if(snapshot.hasData){
    if(localStreamStateIndex < snapshot.data['streamStateIndex']){
        updateLocalState(snapshot.data['data']);
        localStreamStateIndex = snapshot.data['streamStateIndex']; 
    }
}

答案 2 :(得分:0)

@TuanNguyen 的意思

<块引用>

在 initState 方法中构建流

如下,如果您使用 Firestore 为例:

class MyStateFullWidget extends StatefulWidget {
  const MyStateFullWidget({Key key}) : super(key: key);

  @override
  _MyStateFullWidgetState createState() => _MyStateFullWidgetState();
}

class _MyStateFullWidgetState extends State<MyStateFullWidget> {
  Stream _myStream;

  @override
  void initState() {
    super.initState();
    _myStream = FirebaseFirestore.instance.collection(myCollection) ... .snapshots();
  }

  @override
  Widget build(BuildContext context) {
    return SomeUpperWidget(
      child: 
      StreamBuilder(
        stream: _myStream,
        builder: (ctx, snap) => ... ,
      )
    );
  }
}