当我使用
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请求,在这种情况下,它使多个不需要的请求。
编辑:当我删除所有断点时,会发生以下情况:
使用相同的x行
这取决于您的data
的length
。ListView.builder
根据其itemCount
属性重复构建。如果您只想构建一次SolvedQuizDetailsPage
,要么从ListView
中删除它,要么将itemCount
更改为1