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

问题描述

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

解决方法

在这种情况下,您应该使用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,..

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...