Android 颤振:将文本从警报对话框添加到列表视图
我正在尝试将用户输入从警报对话框添加到列表视图。每次我运行它时,警报对话框都会接受输入,项目列表会更新,但列表视图不会更新。在我按下警报对话框按钮上的OK后,应用程序的状态不会改变。请帮我解决这个问题,因为我是新手Android 颤振:将文本从警报对话框添加到列表视图,android,flutter,flutter-layout,Android,Flutter,Flutter Layout,我正在尝试将用户输入从警报对话框添加到列表视图。每次我运行它时,警报对话框都会接受输入,项目列表会更新,但列表视图不会更新。在我按下警报对话框按钮上的OK后,应用程序的状态不会改变。请帮我解决这个问题,因为我是新手 Future<String> createAlertDialog(BuildContext context) { //promise to return string TextEditingController customControll
Future<String> createAlertDialog(BuildContext context) {
//promise to return string
TextEditingController customController =
TextEditingController(); //new texteditingc object
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text("Enter URL: "),
content: TextField(
controller: customController,
),
actions: [
MaterialButton(
elevation: 5.0,
child: Text("OK"),
onPressed: () {
Navigator.of(context).pop(customController.text.toString());
},
)
],
);
});
}
@override
Widget build(BuildContext context) {
List item = List();
item=['HI'];
String temp;
return Scaffold(
appBar: AppBar(
title: Text("Shortie"),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
children:
item.map((element)=>Text(element)).toList(),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
createAlertDialog(context).then((onValue) {
temp=onValue;
print(temp);
});
setState(() {
item.add(temp);
print(item);
});
},
tooltip: 'Add URL',
child: Icon(Icons.add),
),
);
Future createAlertDialog(构建上下文){
//承诺返回字符串
文本编辑控制器自定义控制器=
TextEditingController();//新的texteditingc对象
返回显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“输入URL:”),
内容:TextField(
控制员:客户控制员,
),
行动:[
材料按钮(
标高:5.0,
孩子:文本(“OK”),
已按下:(){
Navigator.of(context.pop(customController.text.toString());
},
)
],
);
});
}
@凌驾
小部件构建(构建上下文){
列表项=列表();
项目=['HI'];
字符串温度;
返回脚手架(
appBar:appBar(
标题:文本(“缩写”),
),
主体:填充物(
填充:常数边集全部(8.0),
子:ListView(
儿童:
item.map((元素)=>Text(元素)).toList(),
),
),
浮动操作按钮:浮动操作按钮(
已按下:(){
createAlertDialog(上下文)。然后((onValue){
温度=开度值;
打印(临时);
});
设置状态(){
添加项目(临时);
印刷品(项目);
});
},
工具提示:“添加URL”,
子:图标(Icons.add),
),
);
如果有新信息,必须调用setState()来更新小部件
尝试将您的showDialog()
更改为:
showDialog(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“输入URL:”),
内容:TextField(
控制员:客户控制员,
),
行动:[
材料按钮(
标高:5.0,
孩子:文本(“OK”),
已按下:(){
添加(customController.text);
setState((){});
Navigator.of(context.pop();
},
)
],
);
});
这应该会将元素添加到项列表中,更新小部件,然后弹出。刷新和弹出对话框之间的时间几乎是瞬间的,因此应该是平稳的
此外,您可能希望使用ListView.builder
,该类将显示一个列表,该列表取决于所选列表的元素数量
话虽如此,将列表视图更改为该视图将有助于将来:
child:ListView.builder(
itemCount:item.length,
itemBuilder:(上下文,索引){
返回文本(“${item.index}”),
},
),
您应该使用等待的instate of然后
。并将项
作为类属性。您的列表不会更新,因为每次调用setState时,由于项=['HI']
此行,生成函数会重新生成,并且项的值设置为['HI']
同样,当您使用then函数时,只有then函数中的代码将在future完成时执行。这就是为什么在对话框完成之前调用setState
在这里,我对您的代码进行了一些更改:
List item = List();
String temp;
Future<String> createAlertDialog(BuildContext context) {
//promise to return string
TextEditingController customController =
TextEditingController(); //new texteditingc object
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text("Enter URL: "),
content: TextField(
controller: customController,
),
actions: [
MaterialButton(
elevation: 5.0,
child: Text("OK"),
onPressed: () {
Navigator.of(context).pop(customController.text.toString());
},
)
],
);
});
}
@override
void initState() {
item = ['HI'];
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Shortie"),
),
body: Padding(
padding: const EdgeInsets.all(8.0),
child: ListView(
children: item.map((element) => Text(element)).toList(),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
temp = await createAlertDialog(context);
setState(() {
item.add(temp);
print(item);
});
},
tooltip: 'Add URL',
child: Icon(Icons.add),
),
);
}
List item=List();
字符串温度;
未来createAlertDialog(BuildContext上下文){
//承诺返回字符串
文本编辑控制器自定义控制器=
TextEditingController();//新的texteditingc对象
返回显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“输入URL:”),
内容:TextField(
控制员:客户控制员,
),
行动:[
材料按钮(
标高:5.0,
孩子:文本(“OK”),
已按下:(){
Navigator.of(context.pop(customController.text.toString());
},
)
],
);
});
}
@凌驾
void initState(){
项目=['HI'];
super.initState();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“缩写”),
),
主体:填充物(
填充:常数边集全部(8.0),
子:ListView(
子项:item.map((元素)=>Text(元素)).toList(),
),
),
浮动操作按钮:浮动操作按钮(
onPressed:()异步{
temp=等待createAlertDialog(上下文);
设置状态(){
添加项目(临时);
印刷品(项目);
});
},
工具提示:“添加URL”,
子:图标(Icons.add),
),
);
}
您可以通过使用notifyListeners()
并使ListView
成为提供者数据的消费者,使用AlertDialog
与ListView
进行通信
有关该软件包的更多信息:您想在列表中显示输入的URL吗?是的,我想在进行上述更改并重新启动应用程序后执行此操作,效果非常好。干杯。感谢您的帮助。