【问题标题】:Flutter cannot increment inside listtile, always returning 0Flutter 不能在 listtile 内递增,总是返回 0
【发布时间】:2021-11-28 21:43:27
【问题描述】:

我想在点击 ListTile 时增加尾随 ListTile Flutter 的数字,
但总是返回0?
我正在使用future builder fyi, 提前致谢

这是我的模特

class ItemModel {
  String name;
  String price;
  String image;
  bool isSelected = false;
  int countSelected = 0;

  ItemModel(
    this.name,
    this.price,
    this.image,
  );
}

从本地服务器获取api json数据的方法

  Future<List<ItemModel>> _getItems() async {
    List<ItemModel> listItems = [];
    var url = Uri.parse(BASEURLLOCAL.apiGetItems);
    var data = await http.get(url);
    var jsonData = jsonDecode(data.body);

    for (var p in jsonData) {
      ItemModel item = ItemModel(
        p["name"],
        p["price"],
        p["image"],
        // p["PRODUCT_NAME"],
        // p["PRICE_SELL"],
        // p["FILENAME"],
      );
      listItems.add(item);
    }
    return listItems;
  }

这就是列表视图构建器

  @override
  Widget build(BuildContext context) {
    
    return FutureBuilder<List<ItemModel>>(
      future: _getItems(),
      builder: (context, snapshot) {
        if (snapshot.data == null) {
          return Container(
            child: Center(
              child: CircularProgressIndicator(),
            ),
          );
        } else {
          return ListView.builder(
            shrinkWrap: true,
            itemCount: snapshot.data.length,
            itemBuilder: (BuildContext contex, int idx) {
              if (_itemCount.length < snapshot.data.length) {
                _itemCount.add(0);
              }
              return Card(
                child: ListTile(
                  leading: Image.network(
                      BASEURLLOCAL.imgItem + snapshot.data[idx].image),
                  title: Text(snapshot.data[idx].name),
                  subtitle: Text(snapshot.data[idx].price),
                  // trailing: _buildTrailing(),
                  trailing: Text(snapshot.data[idx].countSelected.toString()),
                  onTap: () {
                    setState(() {
                      snapshot.data[idx].countSelected++;
                    });
                  },
                ),
              );
            },
          );
        }
      },
    );
  }

this is what the problem is

【问题讨论】:

  • 您是否尝试将 0 改为 1? _itemCount.add(1);
  • 是的,我做到了,和以前一样,1 更改 2 并返回到 1
  • 您必须删除 FutureBuilder 因为每次您 onTap 它都会重建并获取新数据。而是将数据存储到List

标签: flutter listview listtile


【解决方案1】:

试试这样,创建一个列表

List<ItemModel> listItems = [];

然后,在initState() 中调用_getItems()

_getItems() async {
    var url = Uri.parse(BASEURLLOCAL.apiGetItems);
    var data = await http.get(url);
    var jsonData = jsonDecode(data.body);

    for (var p in jsonData) {
      ItemModel item = ItemModel(
        p["name"],
        p["price"],
        p["image"],
        // p["PRODUCT_NAME"],
        // p["PRICE_SELL"],
        // p["FILENAME"],
      );
      listItems.add(item);
    }
  }

并删除FutureBuilder

@override
  Widget build(BuildContext context) {
    return ListView.builder(
      shrinkWrap: true,
      itemCount: listItems.length,
      itemBuilder: (BuildContext context, int idx) {
        if (_itemCount.length < listItems.length) {
          _itemCount.add(0);
        }
        return Card(
          child: ListTile(
            leading: Image.network(BASEURLLOCAL.imgItem + listItems[idx].image),
            title: Text(listItems[idx].name),
            subtitle: Text(listItems[idx].price),
            // trailing: _buildTrailing(),
            trailing: Text(listItems[idx].countSelected.toString()),
            onTap: () {
              setState(() {
                listItems[idx].countSelected++;
              });
            },
          ),
        );
      },
    );
  }

通过这种方式,它不会在每次重建时都获取。

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 2015-09-27
    • 2014-03-20
    • 2013-04-13
    • 2013-03-30
    • 2016-07-13
    • 2023-04-09
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多