首页 > 解决方案 > 嵌套的 Flutter Futurebuilder 不更新视图

问题描述

我有一个有状态小部件,我在无状态小部件中显示。我在我的应用程序的几个部分重用了这个小部件,它在那里工作。

小部件看起来像这样

  class InnerWidget extends StatefulWidget {

  // private keys for objects in the remote dataahase
  List<int> privateKeys;

  const InnerWidgt({
    Key key,
    this.privateKeys,
  }) : super(key: key);

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

class _InnerWidgetState extends State<InnerWidget> {

  // data retrieved from the database
  Future<List<SomeClass>> data;

  @override
  void initState() {
    this.data = this.fetchData(widget.privateKeys);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<SomeClass>> (
      future: this.data,
      builder: (BuildContext contest, AsyncSnapshot<List<SomeClass>> snapshot) {
        if(snapshot.hasData){
            // return a widget (a list of names in this case)
        }
        return Text('Loading...');
      }
    );
  }

  Future<List<SomeClass>> fetchData(List<int> pKeys){
    // fetches the JSON objects from the server and returns them as instances
  }
}

小部件被创建并给出了一个键列表,它调用远程 API 来获取一些对象并将它们显示在一个列表中。我认为这个小部件可以自行处理可能很好,但也许它的设计不好?

发生的情况是,该fetchData()方法永远不会被调用,并且永远显示“正在加载...”。但是snapshot.hasData确实返回 true,所以我认为这是某种重绘问题。

我正在谈论的视图是详细视图,您可以从列表 (ListView) 导航到该视图。我在 ListView 内的元素中使用了完全相同的InnerWidget,它工作得非常好。但是当我单击该项目以导航到详细信息页面时,相同的InnerWidget不起作用。(我知道两次获取相同的数据并不好,我脑子里有它来改变它,而且下面已经有一个缓存)。也许这与 ElementTree 中的保留状态有关?那是因为我使用的是相同的InnerWidgit,它会保留其状态而不是重新渲染?

我希望我的问题表述得足够好,我不想向你扔数百行代码,这就是为什么至少创建了这个小部件的最小示例。如果需要,我也可以添加列表和导航部分,但也许这是一些与 Flutter 合作过的人马上就知道的东西,我只有 3 周的时间。

标签: flutter

解决方案


推荐阅读