首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >何时在颤振中使用FutureBuilder

何时在颤振中使用FutureBuilder
EN

Stack Overflow用户
提问于 2021-07-14 05:12:54
回答 6查看 4.3K关注 0票数 6

我想知道什么时候使用FutureBuilder,以及它是如何有用的,因为一个小部件可以在其生命周期内多次构建,而不仅仅是当我们使用setState或更新它时,所以不要使用下面的代码:

代码语言:javascript
运行
复制
class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool done = false;

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

  Future<void> wait() async {
    await Future.delayed(Duration(seconds: 2));
    setState(() {
      done = true;
    });
  }

  @override
  Widget build(BuildContext context) {
    print('is built');
    return done ? Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    ) : Scaffold(body: CircularProgressIndicator(),);
  }
}

在这种情况下,FutureBuilder可以代替上面的设置,因为我也希望优化我的应用程序,以减少后端读取(在FutureBuilder中,我会多读一次)。我正在寻找的情况下,FutureBuilder将是更有用和正确的比上述设置。

EN

Stack Overflow用户

发布于 2021-08-30 09:32:05

StatefulWidget只是一个状态变量为_snapshot的FutureBuilder。

初始状态为_snapshot = AsyncSnapshot<T>.withData(ConnectionState.none, widget.initialData);

FutureBuilder通常用于删除样板代码.

考虑到您希望从页面启动的后端获取一些数据,并在数据出现之前显示一个加载程序。

它订阅我们通过构造函数发送的未来,并在此基础上更新状态。

用于 FutureBuilder:的任务

未来Builder

  • Based on connectionState的异步任务,显示消息(加载,活动(流),完成)基于数据的

  • (snapshot.hasError),显示视图

FutureBuilder的好处

setState

  • Reactive

  • 不使用两个状态变量,编程(FutureBuilder将负责更新数据到达时的视图)

示例:

代码语言:javascript
运行
复制
FutureBuilder<String>(
future: _fetchNetworkCall, // async work
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
   switch (snapshot.connectionState) {
     case ConnectionState.waiting: return Text('Loading....');
     default:
       if (snapshot.hasError)
          return Text('Error: ${snapshot.error}');
       else
      return Text('Result: ${snapshot.data}');
    }
  },
)

因此,总结未来构建器是我们通常所做工作的wrapper/boilerplate,因此不应该对性能产生任何影响。

票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68372366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档