Как настроить AlertDialog и использовать Future <List> - PullRequest
1 голос
/ 28 мая 2020

Я создаю проект с flutter и firestore. Это проект домашней автоматизации. В этом проекте у меня есть много карточек, которые могут включать и выключать вещи, в настоящее время для каждого пользователя я создал 3 основные карточки, которые создаются при регистрации.

Что я пытаюсь сделать do прямо сейчас - с помощью кнопки ДОБАВИТЬ я создам еще одну карточку с информацией, которую пользователь хочет установить для этой карточки. Мне удалось создать информацию в моем хранилище пожаров, но пользователь не может выбрать, что на нем происходит. Вот что я пытаюсь исправить прямо сейчас. Итак, когда пользователь нажимает кнопку ДОБАВИТЬ, я создаю AlertDialog, в который он может поместить свою информацию для создания новой кнопки . Я пытался создать AlertDialog, но я не знаю, почему, когда я пытаюсь установить для него больше текстовых полей (мне понадобится 4), это не сработает. И с помощью этого AlertDialog я создал Future, который должен был вернуть список, но, похоже, работает только со строкой.
Это код для диалогового окна:

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]                                        
                                  }); 

Если есть способ создать диалоговое окно с предупреждением, которое я мог бы настроить, чтобы установить больше текстовых полей и по-разному позиционировать материал, пожалуйста, предложите. Спасибо

1 Ответ

2 голосов
/ 28 мая 2020

Вы можете просто иметь Column в content вашего AlertDialog, содержащего несколько TextField с их собственными TextEditingController.

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

content принимает любой тип из Widget. Это может быть вложенная структура с несколькими столбцами, строками и т. Д. c. и может иметь отступ или указать c высоту или ширину.

После этого просто создайте список значений при вызове 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);

...