【问题标题】:How to get data individually from List View childs in Flutter?如何从 Flutter 中的列表视图子项中单独获取数据?
【发布时间】:2018-07-09 08:50:04
【问题描述】:

我创建了一个显示数据的活动,例如购物应用程序,其中产品位于左侧,+ 和 - 符号位于右侧。

我创建了一个新类来创建 + 和 - 以便它们可以在主类中单击和调用时独立工作。

class Counter extends StatefulWidget {


  @override
  CounterState createState() => new CounterState();
}

class CounterState extends State<Counter> {

  int itemCount = 0;

  int totalCost= 0;

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 100.0,
        alignment: Alignment.center,
        child:  Row(
          children: <Widget>[
            itemCount!=0 ?new IconButton(icon: new Icon(Icons.remove_circle_outline, size: 30.0,
            ),
                onPressed: (){
                  setState(()=>itemCount--);
                }
            ) :new Container(),

            new Text(itemCount.toString(), style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),),

            new IconButton(icon: new Icon(Icons.add_circle_outline, size: 30.0,
            ),
            onPressed: () {
              setState(() => itemCount++);
            }
            )
          ],
        ),
      );
  }
}

现在如何将每个产品的计数器数据单独传递,以便我可以知道哪个产品被选择了多少次到我这样调用的类。

child: new ListView(
             children: new List.generate(1, (i)=> Counter()
    )                                                                               

【问题讨论】:

  • 不清楚。你想要什么?
  • 我在问每当用户点击这里的 + 和 - 按钮时,计数器的值会增加或减少。现在我在另一个 Widget 中调用这个 Widget,其中在每个产品的前面创建了一个 + 和 - 列表。如何将每个产品的计数器值传递给调用此 Widget 的 Main 类?

标签: flutter flutter-layout


【解决方案1】:

有很多方法可以做到这一点。我推荐的方法是让父小部件存储主状态,并将其事件处理程序作为参考传递给子小部件,并在需要时让子小部件更新方法。

所以在父小部件上,你可以这样做

  var cart = List<Item>; // Create a model where you can store the items 

  void _handleCartChanges(Item newValue) {
    setState(() {
      cart.addValue(newValue) // do your stuff with the newvalue 
    });
  }

child: new ListView(
             children: new List.generate(1, (i)=> Counter(onPressed:_handleCartChanges)
    )   

现在您可以致电父级的onPressed 通知更改

class Counter extends StatefulWidget {
  Counter({Key key,  @required this.onPressed})
      : super(key: key);

  final bool active;
  final ValueChanged<Item> onPressed;

  void _handlePress(int value) {  
    var item = Item(...) // create an item with the new vlaues
    onPressed(item); // and pass it
  }

所以每当您设置计数器值时,也要通知父级

 onPressed: (){
                  setState(()=>itemCount--);
                  _handlePress(itemCount) // call the parent 
                }

这不是一个有效的代码,但现在你知道如何在父子之间传递状态了。

【讨论】:

  • 感谢您的解决方案。我会试试这个,如果它解决了我的问题,我会接受你的回答。
  • 您能帮我弄清楚如何传递每个列表图块的索引吗?如您所知,我正在为每个产品创建此添加和删除图块。所以如果我需要创建那个产品,那么我需要知道这个磁贴是哪个索引。如何在构造函数中传递索引以及 onPressed?
  • 您可以这样做class Counter extends StatefulWidget { Counter({Key key, @required this.onPressed, @required this.index}) : super(key: key); final int index; 并在计数器children: new List.generate(1, (i)=&gt; Counter(onPressed:_handleCartChanges,index:i) 中传递索引
  • 太多的位置参数,0 需要 1 发现错误,只要我这样做。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多