Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 在flifter中将列表传递给另一个类_List_Flutter_Dart_Parameter Passing - Fatal编程技术网

List 在flifter中将列表传递给另一个类

List 在flifter中将列表传递给另一个类,list,flutter,dart,parameter-passing,List,Flutter,Dart,Parameter Passing,我在NameViewList中有一个字符串列表“names”,并试图将其值传递给另一个类Basic() 我尝试了这种方法,但它给了我一个错误: 错误:“names”是final,在声明它时被赋予了一个值,因此无法将其设置为新值。(在[flatterspinningwheel]lib/nameviewlist.dart:5处的声明和构造函数中,最终初始化了) 我用这种方法传递变量,它是有效的,但当我传递列表时,它不起作用 class NameViewList extends Statef

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

我尝试了这种方法,但它给了我一个错误: 错误:“names”是final,在声明它时被赋予了一个值,因此无法将其设置为新值。(在[flatterspinningwheel]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)));
                },
              ),
            ],
          ),
class NameViewList扩展了StatefulWidget{
NameViewList({Key,this.names});
最终名单名称=[];
@凌驾
_NameViewListState createState()=>\u NameViewListState();
}
类_NameViewListState扩展状态{
TextEditingController name控制器=TextEditingController();
createDialog(构建上下文){
返回showDialog(上下文:上下文,生成器:(上下文){
返回警报对话框(
标题:文本(“插入名称”),
内容:TextField(
控制器:名称控制器,
装饰:输入装饰(
边框:OutlineInputBorder(),
labelText:“联系人姓名”,
),
),
行动:[
材料按钮(
子项:文本('Submit'),
已按下:(){
addItemToList();
Navigator.of(context.pop();
},
)
],
);
});
}
void addItemToList(){
设置状态(){
widget.names.insert(0,nameController.text);
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“设置”),
标题:对,
),
正文:专栏(
儿童:[
图标按钮(
图标:图标(Icons.queue,颜色:Colors.green,),
onPressed:(){createDialog(context);},
),
填充物(
填充:边缘设置。全部(20),
孩子:TextField(
控制器:名称控制器,
装饰:输入装饰(
边框:OutlineInputBorder(),
labelText:“联系人姓名”,
),
),
),
划船(
儿童:[
升起的按钮(
子项:文本('Clear'),
已按下:(){
设置状态(){
widget.names.clear();
});
},
),
升起的按钮(
子项:文本('Submit'),
已按下:(){
Navigator.of(context).push(MaterialPageRoute(builder:(context)=>Basic(name:names));
},
),
],
),

如果使用final构造函数声明变量,则无法修改该变量。因此,要解决问题,可以创建另一个变量并将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)));
                },
              ),
            ],
          )
        ],
      ),
    );
  }
}
class NameViewList扩展了StatefulWidget{
最后名单名称;
NameViewList({Key,this.names});
@凌驾
_NameViewListState createState()=>\u NameViewListState();
}
类_NameViewListState扩展状态{
TextEditingController name控制器=TextEditingController();
列表名称=[];
createDialog(构建上下文){
返回显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“插入名称”),
内容:TextField(
控制器:名称控制器,
装饰:输入装饰(
边框:OutlineInputBorder(),
labelText:“联系人姓名”,
),
),
行动:[
材料按钮(
子项:文本('Submit'),
已按下:(){
addItemToList();
Navigator.of(context.pop();
},
)
],
);
});
}
void addItemToList(){
设置状态(){
names.insert(0,nameController.text);
});
}
@凌驾
void initState(){
super.initState();
名称=widget.names;
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“设置”),
标题:对,
),
正文:专栏(
儿童:[
图标按钮(
图标:图标(
Icons.queue,
颜色:颜色。绿色,
),
已按下:(){
创建对话框(上下文);
},
),
填充物(
填充:边缘设置。全部(20),
孩子:TextField(
控制器:名称控制器,
装饰:输入装饰(
边框:OutlineInputBorder(),
labelText:“联系人姓名”,
),
),
),
划船(
儿童:[
升起的按钮(
子项:文本('Clear'),
已按下:(){
设置状态(){
name.clear();
});
},
),
升起的按钮(
子项:文本('Submit'),
已按下:(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(上下文)=>Basic(名称:names));
},
),
],
)
],
),
);
}
}
更改以下行:

  NameViewList({Key key, this.names});
  final List<String> names = <String>[];
NameViewList({Key,this.names});
最终名单名称=[];
致:

NameViewList({List names}):this.names=names???[];
最后名单名称;
您的问题是,您正在使用一个值设置一个
final
变量两次。首先,您将其设置为一个空字符串列表。然后,如果可选参数(如果没有可选参数,则该值设置为null),您将再次设置它

相反,我的解决方案改变了它,因此我们只需要
  NameViewList({List<String> names}) : this.names = names ?? [];
  final List<String> names;