【问题标题】:dismiss something in a dynamic list取消动态列表中的某些内容
【发布时间】:2020-03-20 08:48:48
【问题描述】:

下面的代码很好我只是对返回 Dismissible(key: Key(list) 有一个问题。

Key(list) 表示“参数类型列表...不能分配给参数类型。”

我的意思是列表没有定义,因为它是动态的并且从用户那里获取信息。

谁有解决方案?

  TextEditingController tc;
  List<String> list = [];

  @override
  void initState() {
    super.initState();
    tc = TextEditingController();
  }

  @override
  Widget build(BuildContext context) {
      body:ListView.builder(
        itemCount:list.length,
      itemBuilder:(context,index){
       return Dismissible(key: Key(list),
        onDismissed: (direction) {
          setState(()
          {
            list.removeAt(index);
          }); Scaffold.of(context).showSnackBar(SnackBar(content: Text('$list dismissed')));
          Container(color: Colors.red);

        },

       child: ListTile(
        title:Text(list[index],
                  style: TextStyle(color:Colors.black)),


                  ));
  }));}

  void showPopup() {
    tc.text = '';
    showDialog(
        context: context,
        builder: (con) => AlertDialog(
                title: Text('Add new Asset'),
                content: TextField(
                    controller: tc,
                    decoration: InputDecoration(
                      border: OutlineInputBorder(),
                      labelText: 'Asset',
                    )),
                actions: [
                 MaterialButton(
            child: Text('ADD'),
            onPressed: () {
                        if (tc.text.trim().isNotEmpty) addToList();
                        Navigator.of(con).pop();
                      })
                ]));
  }

  void addToList() {
    setState(() {
      list.add(tc.text.trim());
    });
  }
}

谢谢

【问题讨论】:

    标签: list flutter


    【解决方案1】:

    Key 采用 String 作为参数,而不是 List。实现此目的的一个好方法是使用 UniqueKey

    举例

    class Home extends StatelessWidget {
    
      var myList = List.generate(100, (index) => index);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SafeArea(
            child: ListView.builder(
              itemCount: myList.length,
              itemBuilder: (context, index){
                return Dismissible(
                  key: UniqueKey(),
                  child: ListTile(
                    title: Text("Hey $index"),
                  ),
                  onDismissed: (direction){
                    myList.removeAt(index);
                  },
                );
              },
            ),
          ),
        );
      }
    }
    

    您也可以通过使用索引作为键来实现这一点 像这样

    import 'package:flutter/material.dart';
    
    class Home extends StatelessWidget {
    
      var myList = List.generate(100, (index) => index);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: SafeArea(
            child: ListView.builder(
              itemCount: myList.length,
              itemBuilder: (context, index){
                return Dismissible(
                  key: Key("$index"),
                  child: ListTile(
                    title: Text("Hey $index"),
                  ),
                  onDismissed: (direction){
                    myList.removeAt(index);
                  },
                );
              },
            ),
          ),
        );
      }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 2018-11-11
      相关资源
      最近更新 更多