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