我有所有交易_deals
的列表和选定交易_selectedDeals
的列表。可以将交易添加到其他类别的列表_selectedDeals
中或从中删除。因此,如果添加/删除了新交易,我想重建此DealsWidget
,以便新添加/删除的交易可以正确反映在UI中。
我正在使用BookButton
有状态的小部件,以显示是否选择了交易。 isBooked
为真时,表示已选择交易。
我计划通过在其他类中添加/删除数据后调用refresh()
的{{1}}函数来实现此行为,这样它将重建所有内容,并且我的UI与数据一致,但是什么也没发生
我发现,重建不会再次创建DealsWidget
小部件。他们的构造函数不再被调用。这就是为什么我的更新后的值没有得到娱乐的原因,因为我在BookButton
的构造函数中传递了它们。
任何人都可以解释为什么会发生这种情况,如何正确显示哪些交易被选中,哪些没有被选中?
DealsWidget
BookButton
BookButton
class DealsWidget extends StatefulWidget {
final List<Deal> _deals;
final List<Deal> _selectedDeals;
final DealSelectionListener _dealSelectionListener;
DealsWidget(
Key dealsKey,
this._deals,
this._selectedDeals,
this._dealSelectionListener,
) : super(key: dealsKey);
@override
DealsWidgetState createState() => DealsWidgetState();
}
class DealsWidgetState extends State<DealsWidget> {
@override
Widget build(BuildContext context) {
final totalDeals = widget._deals.length;
return ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemCount: totalDeals,
shrinkWrap: true,
itemBuilder: (context, index) {
final deal = widget._deals[index];
final isSelected = widget._selectedDeals.contains(deal);
return Container(
color: Colors.white,
padding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
child: BookButton(
isSelected,
(isBooked) {
if (isBooked) {
widget._dealSelectionListener._onSelected(deal);
} else {
widget._dealSelectionListener._onDeselected(deal);
}
}
),
);
}
);
}
void refresh() {
print('Refreshing deals');
setState(() {
});
}
}
答案 0 :(得分:0)
在这种情况下,您应该使用Provider,因为该小部件需要知道何时进行重建。
或者,如果您认为Provider现在很难学习,请尝试在事件ClickButton上使用SetState(),此方法应该解决
看看我在案件中做了什么
因此在我的数据类中,我使用了change changeNotifier
class PartnerControler extends ChangeNotifier {
....
changeNotifiers()
}
在我使用的展示班上
ChangeNotifierProvider(
create: (context) => partnerControler,
child: buildPartnerList(context),
),
Widget buildPartnerList(BuildContext context) {
return Column(
children: <Widget>[
Consumer<PartnerControler>(
builder: (context, partnercontroler, child) {
return (Expanded(
child: ListView.builder(
itemCount: partnerControler.partnerListFiltered.length,
..