首页 > 解决方案 > Flutter Visibility 小部件第三次无法正常工作

问题描述

我已经包裹ListView.builderVisible小部件中,其可见属性的按钮位于ListTile带有变量的小部件中_currencyVisible。小部件 Visible 工作 2 次 ie false/hidden(default),然后在单击时变为可见,并在第二次单击时再次隐藏,但在那之后它就不起作用了。在控制台上打印_currencyVisible显示正确的数据。

这是我的代码:

menuItems(BuildContext context) {
  bool _currencyVisible = false;

return StatefulBuilder(
    builder: (BuildContext context, void Function(void Function()) setState) {
      return ListView(
        children: [
          ListTile(
            title: FutureBuilder<dynamic>(
                future: getUserCurrencySymbol(),
                builder:(BuildContext context, AsyncSnapshot<dynamic> snapshot) {
                    return Text("Currency " + snapshot.data.toString());
                }),
            trailing: IconButton(
              icon: Icon(Icons.refresh),
              onPressed: () { setState(() { _currencyVisible = !_currencyVisible; }); },
            ),
          ),

          Visibility(
            visible: _currencyVisible,
            child: ListView.builder(
              shrinkWrap: true,
              itemCount:
                  currency.allCurrenciesList.length,
              itemBuilder: (context, index) {
                for (Currency c in currency.allCurrenciesList) {
                  currency.allCurrenciesList.removeAt(0);
                  return Card(
                    child: ListTile(
                      title: Text(c.country),
                      subtitle: Text(c.shortCurrency),
                      trailing: Text(c.symbol),
                      onTap: () {
                        saveUserCurrency(c.country, context);
                      },
                    ),
                  );
                }
                return Text("Not Null");
              },
            ),
          ),
        ],
      );
    },
  );
}

标签: flutter

解决方案


您正在从货币列表中删除所有数据。小部件显示正确,但没有要显示的数据。

删除此行

currency.allCurrenciesList.removeAt(0);

不要循环遍历itemBuilder. 改为使用index

Visibility(
  visible: _currencyVisible,
  child: ListView.builder(
    shrinkWrap: true,
    itemCount: currency.allCurrenciesList.length,
    itemBuilder: (context, index) {
      final c = currency.allCurrenciesList[index];
      return Card(
        child: ListTile(
        title: Text(.country),
        subtitle: Text(c.shortCurrency),
        trailing: Text(c.symbol),
        onTap: () {
          saveUserCurrency(c.country, context);
        },
      );
    }
    return Text("Not Null");
  ),
),

推荐阅读