0

为了演示这个问题,让我写一些代码FutureBuilder

FutureBuilder(future: _myFuture, builder: (context, snapshot) {
    if(snapshot.hasData) {

        // !!!! IMPORTANT !!!
        // Pay attention to the _isFirstText variable below  

        return SizedBox(
                 child: _isFirstText ? Text(snapshot.data.firstText) : Text(snapshot.data.secondText),
               );  
    }
 
    if(snapshot.connectionState == ConnectionState.isWaiting) {
        return Text('Waiting!');
    }
 
    return Text('Error');
}),  

正如我在上面代码的注释中提到的,请注意_isFirstText变量。假设这是一个状态变量。在future builder中,如何获得与isFirstText状态变量更改相对应的正确返回值。

我也遇到了这个堆栈溢出帖子,但无法让代码工作。
我还遇到了一个名为 的小部件StatefulBuilder,但我不知道FutureBuilder应该在哪里使用它。

有人可以帮忙吗?

4

2 回答 2

1

如果您想收听正在进行的更改,您可以使用 Streambuilder。流不仅用于服务器端更改,还可以在本地使用。

您可以像这样自己构建一个流:

StreamController myStreamController = StreamController<int>();

要通过此控制器发送新事件,您可以执行

myStreamController.sink.add(newValue);

然后,您可以收听如下更改:

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<int>(
        stream: myStreamController.stream,
        builder: (context, snapshot) {
          final value = snapshot.data;

          return Text(value!.toString());
  }

如果您想了解更多信息,请查看此视频:https ://youtu.be/nQBpOIHE4eE

让我知道这是否有帮助。

于 2021-12-16T15:14:57.237 回答
0

您可以使用 ValueNotifier 变量并使用 notifyListeners() 来更新代码的特定部分,如下所示:

ValueListenableBuilder 并使用该 ValueNotifier 变量并收听它。

于 2021-12-16T16:09:34.147 回答