Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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
Android 颤振:将文本从警报对话框添加到列表视图_Android_Flutter_Flutter Layout - Fatal编程技术网

Android 颤振:将文本从警报对话框添加到列表视图

Android 颤振:将文本从警报对话框添加到列表视图,android,flutter,flutter-layout,Android,Flutter,Flutter Layout,我正在尝试将用户输入从警报对话框添加到列表视图。每次我运行它时,警报对话框都会接受输入,项目列表会更新,但列表视图不会更新。在我按下警报对话框按钮上的OK后,应用程序的状态不会改变。请帮我解决这个问题,因为我是新手 Future<String> createAlertDialog(BuildContext context) { //promise to return string TextEditingController customControll

我正在尝试将用户输入从警报对话框添加到列表视图。每次我运行它时,警报对话框都会接受输入,项目列表会更新,但列表视图不会更新。在我按下警报对话框按钮上的OK后,应用程序的状态不会改变。请帮我解决这个问题,因为我是新手

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吗?是的,我想在进行上述更改并重新启动应用程序后执行此操作,效果非常好。干杯。感谢您的帮助。