如何自定义AlertDialog和使用Future

问题描述 投票:0回答:1

我正在创建一个带有扑朔迷离的火力的项目。这是一个家庭自动化项目。在这个项目中,我有很多卡可以打开和关闭东西,目前,对于每个用户,我已经创建了3个主卡,它们是在注册时创建的。我现在想做的是,使用ADD按钮,将使用用户要设置为该卡片的信息创建另一张卡片。我可以设法在Firestore中创建信息,但是,用户无法选择其中的内容。这就是我现在要解决的问题。因此,当用户单击ADD按钮时,我正在创建一个AlertDialog,他可以输入自己的信息来创建新按钮。我试图做的是创建一个AlertDialog,但是我不知道为什么当我尝试为其设置更多TextField时(我将需要4个)它不起作用。并使用此AlertDialog创建了一个Future,该Future应该返回一个List,但似乎只能与String一起使用。这是对话框的代码:

Future<String> createAlertDialog(BuildContext context){

  TextEditingController customController = TextEditingController();

  return showDialog(context: context, builder: (context){
    return AlertDialog(
      title: Text('Text'),
      content: TextField(
        controller: customController,
      ),
      actions: <Widget>[
        MaterialButton(
          elevation: 5.0,
          child: Text("OK"),
          onPressed: (){
            Navigator.of(context).pop(customController.text.toString());
          },
        )
      ],
    );
  });
}

[当用户键入他的信息时,这就是我收集他键入内容的方式:

createAlertDialog(context).then((value){
                                    print(value);
                                  });

稍后,我会将此列表数据插入到Firestore中,这是一个示例:

Firestore.instance.collection('dadosusuarios').document(user.uid)
                                  .collection('buttons').document('button'+ cardamount.toString()).setData({
                                    'activelabel': ListFromAlert[0],
                                    'icondata': ListFromAlert[1],
                                    'inactivelabel': ListFromAlert[2],
                                    'text': ListFromAlert[3]                                        
                                  }); 

[如果有一种方法可以创建一个我可以自定义的警报对话框,那么我可以设置更多的TextField并以不同的方式放置Stuff,请提出建议。 [Thks

flutter flutter-layout
1个回答
0
投票

您可以在Columncontent中只包含一个AlertDialog,其中包含多个TextField和它们自己的TextEditingController

content: Column(
  children: [
    TextField(
      controller: customController1,
    ),
    TextField(
      controller: customController2,
    ),
  ],
),

content取任何类型的Widget。这可以是具有多个列,行等的嵌套结构,并且可以具有填充或特定的高度或宽度。

此后,只需在调用pop时创建值列表即可

onPressed: (){
  final values = [
    customController1.text.toString(),
    customController2.text.toString(),
  ];
  Navigator.of(context).pop(values);
},

关于此问题'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3580 pos 12: '!_debugLocked': is not true.

您可能在导航器中引用了错误的context。尝试将context重命名为ctx作为构建器的参数:

showDialog(context: context, builder: (ctx){

并将其用于导航器:

Navigator.of(ctx).pop(values);

© www.soinside.com 2019 - 2024. All rights reserved.