首页 > 解决方案 > OpenContainer(动画包)中的 openBuilder 构建两次

问题描述

当我使用

Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => SolvedQuizDetailsPage(),
  ),
);

SolvedQuizDetailsPage(它是一个 StatelessWidget)只调用@override build一次(这是预期的行为)。但是当我使用 OpenContainer 时:

 return FutureBuilder(
  future: SolvedQuiz.index(),
  builder: (context, AsyncSnapshot<List<SolvedQuiz>> snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
      return ListView.builder(
        itemCount: snapshot.data.length,
        itemBuilder: (context, i) => OpenContainer(
          openBuilder: (context, _) {
            return SolvedQuizDetailsPage();
          },
          closedBuilder: (context, open) => ListTile(
            title: Text(snapshot.data[i].quiz.title),
            subtitle: Text(snapshot.data[i].quiz.description),
            leading: CircleAvatar(
              child: DeliverableIcon(status: snapshot.data[i].status),
            ),
            // onTap: open,
          ),
        ),
      );
    } else {
      return Center(child: CircularProgressIndicator());
    }
  },
);

小部件构建了两次

这个 print() 在@override build 的第一行

这还不是全部,例如,当我 使用此按钮返回时

第三次构建

我只需要构建一次小部件,因为每次构建它都必须发出一个 http 请求,在这种情况下它会发出多个不需要的请求。

编辑:当我删除所有断点时,会发生这种情况:

ui 相同的 x 行

标签: flutterflutter-animation

解决方案


这取决于length您的data. ListView.builder根据其itemCount属性重复构建。如果您只想构建SolvedQuizDetailsPage一次,请将其从 中删除ListView或更改itemCount为 1


推荐阅读