Как сохранить значения из всплывающего окна в экземпляр в другой класс? - PullRequest
0 голосов
/ 10 июля 2020

Я разработал флаттер-экран, на котором у меня есть кнопка при нажатии на эту Button A Я получаю всплывающее окно, в котором есть Button 1 для добавления нового текстового поля, и мы можем добавить любое количество текстовых полей, для этого у меня есть использован пример зависимости flutter_form_bloc. Затем во всплывающем окне есть еще одна кнопка, ie Button 2, которая при нажатии обрабатывает данные, введенные в текстовые поля, и закрывает всплывающее окно.

Теперь, когда я снова нажимаю Button A, чтобы открыть во всплывающем окне исчезнут все текстовые поля и данные. Я не хочу, чтобы это случилось. Я хочу, чтобы они были там до тех пор, пока основной экран дрожания не появится или не будет закрыт.

Более того, при нажатии Button 2 во всплывающем окне данные должны быть переданы в класс основного экрана дрожания, в котором Button A есть и должен храниться в экземпляре, чтобы передаваемые данные можно было обрабатывать дальше.

Вот скриншоты, чтобы понять [ Image 1 ] 1 [ Изображение 2 ] 2

КОД

  FormBlocListener<ListFieldFormBloc2, String, String>(
            onSubmitting: (context, state) {
              
            },
            onSuccess: (context, state) {


              String name1;

              var parsedData = json.decode(state.successResponse);
              List members = parsedData['members'];
            



              members.forEach((member){
                
                name1 = member['step'];
               
                List<String> _step = [];
                _step.add(member["step"]);

                _AddStepsState().getsteps(members);

              });


              _AddStepsState(steps: members);
              Navigator.pop(context);



            },
            onFailure: (context, state) {
             

              Scaffold.of(context).showSnackBar(
                  SnackBar(content: Text(state.failureResponse)));
            },
            child: SingleChildScrollView(
              physics: ClampingScrollPhysics(),
              child: Column(
                children: <Widget>[
                  BlocBuilder<ListFieldBloc<MemberFieldBloc2>,
                      ListFieldBlocState<MemberFieldBloc2>>(
                    bloc: formBloc.members,
                    builder: (context, state) {
                      if (state.fieldBlocs.isNotEmpty) {
                        return ListView.builder(
                          shrinkWrap: true,
                          physics: const NeverScrollableScrollPhysics(),
                          itemCount: state.fieldBlocs.length,
                          itemBuilder: (context, i) {
                            return MemberCard2(
                              memberIndex: i,
                              memberField: state.fieldBlocs[i],
                              onRemoveMember: () =>
                                  formBloc.removeMember(i),

                            );
                          },
                        );
                      }
                      return Container();
                    },
                  ),
                  RaisedButton(
                    color: Colors.blue[100],
                    onPressed: formBloc.addMember,
                    child: Text('ADD STEP'),
                  ),
                ],
              ),
            ),
          ),

Я попытался передать созданный СПИСОК другому class этими способами _AddStepsState(steps: members); и _AddStepsState().getsteps(members);, но оба раза это не удалось.

Я хочу, чтобы список значений в текстовом поле был сгенерирован для передачи другому классу

И Также я хочу, чтобы, пока пользователь находится на экране Screen1, как в Image 1, если поля редактируются, как в image 2, и если пользователь снова открывает всплывающий экран, поля должны оставаться там и не удаляться.

Как должен ли я достичь этого?

если требуется дополнительная информация красный, дайте мне знать

ссылка на используемую зависимость здесь flutter form blo c

1 Ответ

1 голос
/ 11 июля 2020

Я только что создал приложение, которое имеет дело с множеством форм, и решение, которое я выбрал, выглядит следующим образом:

  1. Имейте файл с именем data_center.dart, в котором вы можете определять классы для представления данных, созданных формой / для отображения на странице «обзора».
class MyFormData{

  String firstField;
  String secondField;
  int quantity;
  // more attributes

  // optional constructor
  MyFormData({this.firstField, this.secondField, this.quantity});

}

Создайте переменную для хранения экземпляров класса в data_center.dart
MyFormData currentMyFormDataInstance; // assign an instance every time a new form starts
Создать экземпляр в диалоге (например)
import 'data_center.dart' as DataCenter;

// code removed for brevity

return showDialog(
              context: context,
              builder: (BuildContext context) {
                // create an instance to hold the current form data
                currentMyFormDataInstance = DataCenter.MyFormData();
                return AlertDialog(...);
                    ]);
              });

Контроллер хранилища (предположим, что у нас есть TextFormField) значение в экземпляре
TextFormField(
  controller: _myController,
  onChanged: (String _incomingValue){
    DataCenter.currentMyFormDataInstance.firstField = _incomingValue;
  }
)

Я не знаю, есть ли какие-либо критические ошибки aws или неэффективности, которые могут возникнуть, но до сих пор он работал у меня очень хорошо, поскольку он позволяет мне легко управлять всеми различными типами групп данных, которые я собираю из пользовательского интерфейса.

Более того, сохранение этих данных как объектов, а не типов данных, таких как Map s позволил мне легко преобразовать их, добавив именованные конструкторы или дополнительные методы, которые легко позволяют мне выполнять общие и частые операции с моими данными.

Например, если вы используете Cloud Firestore. Я могу добавить следующий именованный конструктор, чтобы легко сопоставить DocumentSnapshot s с атрибутами класса.

MyFormData.fromDocumentSnapshot(){...}
 
...