ListView中的有状态小部件未更新

时间:2020-09-22 13:20:41

标签: flutter stateful statefulwidget

我有所有交易_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(() {
      
    });
  }
}

1 个答案:

答案 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,
..