相关疑难解决方法(0)

异步与非阻塞

异步和非阻塞调用之间有什么区别?阻塞和同步调用之间(请举例)?

asynchronous synchronous blocking

352
推荐指数
9
解决办法
11万
查看次数

在Flutter中完成"构建"功能时是否有任何回调告诉我?

我的屏幕上有一个listView.我已经附加了一个控制器.我可以调用我的端点,接收响应,解析它并插入行.ListView应该自动滚动.确实如此,但并非完美无缺.我总是背后的一个项目.这是我的代码:

@override
  Widget build(BuildContext context) {
    // Scroll to the most recent item
    if (equationList.length > 0) {
      _toEnd();
    }

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: EquList(equationList, _scrollController),
      floatingActionButton: new FloatingActionButton(
        onPressed: onFabClick,
        tooltip: 'Fetch Post',
        child: new Icon(isLoading ? Icons.pause : Icons.play_arrow),
      ),
    );
  }

  void _toEnd() {
    _scrollController.animateTo(
      _scrollController.position.maxScrollExtent,
      duration: const Duration(milliseconds: 250),
      curve: Curves.ease,
    );
  }
Run Code Online (Sandbox Code Playgroud)

问题是,我_toEnd()在最后一项插入列表之前调用函数.所以,我正在寻找一个回调(如果有的话)告诉我build()完成了.然后我打电话给我的_toEnd()功能.

在这种情况下,最佳做法是什么?

flutter

17
推荐指数
3
解决办法
7695
查看次数

了解颤振渲染引擎

这里的文档关于如何更新ListView发言权:

在Flutter中,如果要更新setState()中的小部件列表,您会很快发现您的数据没有直观地改变.这是因为当调用setState()时,Flutter呈现引擎会查看窗口小部件树以查看是否有任何更改.当它到达ListView时,它执行==检查,并确定两个ListView是相同的.没有任何改变,因此不需要更新.

有关更新ListView的简单方法,请在setState()内创建一个新List,并将旧列表中的数据复制到新列表中.

我不知道渲染引擎如何确定在这种情况下Widget Tree中是否有任何更改.

AFAICS,我们关心调用setState,它将State对象标记为脏并要求重建.一旦它重建就会有新的ListView,不是吗?那么==检查怎么说它是同一个对象呢?

此外,新的List将是State对象的内部,Flutter引擎是否比较对象内的所有State对象?我以为它只比较了Widget树.

所以,基本上我不明白渲染引擎如何决定它将要更新的内容以及将要忽略的内容,因为我无法看到创建新内容如何List向渲染引擎发送任何信息,因为文档说渲染引擎只是寻找新的ListView...而AFAIK新的List不会创造新的ListView.

flutter flutter-layout

9
推荐指数
1
解决办法
1696
查看次数