SliverList未按预期更新

时间:2020-05-01 14:05:14

标签: flutter dart flutter-sliver

我是Flutter的新手,所以请原谅我的误会。

最终,我正在尝试提供一个小条列表,每个小条都带有小部件(项目)列表,并且此小条列表可以更改以及每个项目列表都可以更改。
像这样的


    • 项目
    • 项目
      ...

    • 项目
      ...

等,但我可以继续随意添加和删除条子和物品。 我的幼稚方法基本上如下:

  1. 在我的主窗口小部件构建函数中创建一个CustomScrollView
  2. 为此CustomScrollView为其条子参数引用条子的成员变量列表。
  3. 添加一个按钮以创建新的条子(将条子添加到条子列表中)。
  4. 添加按钮以创建新项目(将项目添加到项目列表)。
  5. 在(4)中添加项目时呼叫setState()
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;
  final List<Widget> slivers = [];
  final List<Text> items = [];

  @override
  _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
  void _addSliver() {
    widget.slivers.add(SliverList(
      delegate: SliverChildBuilderDelegate(
              (context, index) {
                return index < widget.items.length ? widget.items[index] : null;
              })));
  }

  void _addToList() {
    setState(() {
      widget.items.add(Text('Item ${widget.items.length + 1}'));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.category),
            onPressed: _addSliver,
          ),
          IconButton(
            icon: Icon(Icons.add),
            onPressed: _addToList,
          )
        ],
      ),
      body: CustomScrollView(
        slivers: widget.slivers,
      ),
    );
  }
}

上面的代码仅用于测试单个条子和该条子中的多个项目。我在调试时注意到,_build的{​​{1}}函数中不会重建已有的条子,因为它已经存在于Map中,所以很明显我对如何实现该条有理解。 >

我是否仅需要强制以某种方式进行重建?还是有一种更容易的方法来实现我所缺少的?

1 个答案:

答案 0 :(得分:0)

似乎这个想法与使用数组容纳function yourmodule_views_pre_execute(&$view) { if ($view->current_display == "xyz") { $rawQuery = "SELECT something where field = :arg1 "; $q = CustomSQLQuery::query($rawQuery, [ ":arg1" => "foo" ]); $view->build_info['query'] = $q; $view->build_info['count_query'] = $q; } } 的子代不同。每次调用Column时都需要重新构建窗口小部件(除了实际显示的窗口小部件外)。

build
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;
  final Map<int, List<Text>> slivers = {};

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

如果有更好的方法可以实现这一点,我真的很想知道。