【问题标题】:Pass List to another Class in Flutter将 List 传递给 Flutter 中的另一个类
【发布时间】:2020-09-13 14:10:03
【问题描述】:

我在 NameViewList 中有一个字符串“名称”列表,并尝试将其值传递给另一个类 Basic()。

我尝试了这种方法,但它给了我一个错误: 错误:'names' 是最终的,并且在声明时被赋予了一个值,因此不能将其设置为新值。 (final_initialized_in_declaration_and_constructor at [flutterspinningwheel] lib/nameviewlist.dart:5)

我用这种方式传递变量并且它正在工作,但是当我传递列表时它不起作用

     class NameViewList extends StatefulWidget {
  NameViewList({Key key, this.names});
  final List<String> names = <String>[];

  @override
  _NameViewListState createState() => _NameViewListState();
}

class _NameViewListState extends State<NameViewList> {


  TextEditingController nameController = TextEditingController();

   createDialog(BuildContext context){
    return showDialog(context: context, builder: (context) {
      return AlertDialog(
        title: Text('Insert Name'),
        content: TextField(
          controller: nameController,
          decoration: InputDecoration(
            border: OutlineInputBorder(),
            labelText: 'Contact Name',
          ),
        ),
        actions: [
          MaterialButton(
            child: Text('Submit'),
            onPressed: (){
              addItemToList();
              Navigator.of(context).pop();
            },
          )
        ],
      );
    });
  }

  void addItemToList(){
    setState(() {
      widget.names.insert(0, nameController.text);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
        centerTitle: true,
      ),
      body: Column(
        children: [
          IconButton(
            icon: Icon(Icons.queue, color: Colors.green,),
            onPressed: (){createDialog(context);},
          ),
          Padding(
            padding: EdgeInsets.all(20),
            child: TextField(
              controller: nameController,
              decoration: InputDecoration(
                border: OutlineInputBorder(),
                labelText: 'Contact Name',
              ),
            ),
          ),
          Row(
            children: [
              RaisedButton(
                child: Text('Clear'),
                onPressed: () {
                  setState(() {
                    widget.names.clear();

                  });
                },
              ),
              RaisedButton(
                child: Text('Submit'),
                onPressed: () {
                  Navigator.of(context).push(MaterialPageRoute(builder: (context)=> Basic(names: names)));
                },
              ),
            ],
          ),

【问题讨论】:

    标签: list flutter dart parameter-passing


    【解决方案1】:

    更改此行:

      NameViewList({Key key, this.names});
      final List<String> names = <String>[];
    

    收件人:

      NameViewList({List<String> names}) : this.names = names ?? [];
      final List<String> names;
    

    您的问题是您正在设置一个具有两次值的final 变量。首先,您将其设置为一个空的字符串列表。如果可选参数(如果没有可选参数,则将值设置为 null),然后再次设置它。

    相反,我的解决方案对其进行了更改,因此我们只设置一次names 变量,首先询问可选参数是否为空(未设置),如果是这种情况,我们将值设置为空列表。否则,我们使用可选参数。

    【讨论】:

    • 我这样做了,它工作了,但我应该添加 Navigator() 以将列表传递到 Basic() 屏幕。这是它的代码:Navigator.of(context).push(MaterialPageRoute (builder: (context)=> Basic()));
    • 对不起,我不知道。我不是 Flutter 开发人员,但我希望其他人可以帮助您。我只知道如何通过最终变量的双重分配来解决您的具体问题。 :)
    【解决方案2】:

    如果使用最终构造函数声明,您将无法修改变量。因此,您可以做些什么来解决您的问题是创建另一个变量并将 final 的值归因于它。问题可以这样解决:

    class NameViewList extends StatefulWidget {
      final List<String> names;
      NameViewList({Key key, this.names});
    
      @override
      _NameViewListState createState() => _NameViewListState();
    }
    
    class _NameViewListState extends State<NameViewList> {
      TextEditingController nameController = TextEditingController();
      List<String> names = <String>[];
    
      createDialog(BuildContext context) {
        return showDialog(
            context: context,
            builder: (context) {
              return AlertDialog(
                title: Text('Insert Name'),
                content: TextField(
                  controller: nameController,
                  decoration: InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'Contact Name',
                  ),
                ),
                actions: [
                  MaterialButton(
                    child: Text('Submit'),
                    onPressed: () {
                      addItemToList();
                      Navigator.of(context).pop();
                    },
                  )
                ],
              );
            });
      }
    
      void addItemToList() {
        setState(() {
          names.insert(0, nameController.text);
        });
      }
    
      @override
      void initState() {
        super.initState();
        names = widget.names;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Settings'),
            centerTitle: true,
          ),
          body: Column(
            children: [
              IconButton(
                icon: Icon(
                  Icons.queue,
                  color: Colors.green,
                ),
                onPressed: () {
                  createDialog(context);
                },
              ),
              Padding(
                padding: EdgeInsets.all(20),
                child: TextField(
                  controller: nameController,
                  decoration: InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'Contact Name',
                  ),
                ),
              ),
              Row(
                children: [
                  RaisedButton(
                    child: Text('Clear'),
                    onPressed: () {
                      setState(() {
                        names.clear();
                      });
                    },
                  ),
                  RaisedButton(
                    child: Text('Submit'),
                    onPressed: () {
                      Navigator.of(context).push(MaterialPageRoute(
                          builder: (context) => Basic(names: names)));
                    },
                  ),
                ],
              )
            ],
          ),
        );
      }
    }
    

    【讨论】:

    • 我做到了,但收到此错误:错误:未定义命名参数“名称”。基本(名称:名称)));
    • @AlexAli 可以附上这个Basic类的代码吗?
    • 它不允许我,因为代码太长.. 我设法导航并将列表传递到其他页面.. 感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2014-02-24
    • 2013-12-10
    • 2013-07-24
    • 2020-12-30
    相关资源
    最近更新 更多