Как проверить форму внутри bottomSheet, который входит в Scaffold? - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел бы проверить форму внутри bottomSheet, который включен в Scaffold.

Проблема в том, что когда я закрываю bottomSheet и нажимаю «SAVE» (в AppBar).

Кажется, окончательная форма = _formAddPlayerKey.currentState; вернуть ноль, когда нижний лист закрыт.

Когда нижний лист открыт, я могу проверить форму.

Мой код, скаффолд с нижним листом внутри:

return Scaffold(

      key: _scaffoldKey,
      appBar: AppBar(

        title: Text('MyTitle'),
        actions: <Widget>[
          //--- Form validation
          FlatButton(
            onPressed: () {
                  final form = _formAddPlayerKey.currentState;

              if (form.validate()) {
                form.save();

                print('SAV OK!!!');
              }
            },
            child: Text(
              'SAVE',
              style: Theme.of(context)
                  .textTheme
                  .subhead
                  .copyWith(color: Colors.white),
            ),
          )
        ],
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
      floatingActionButton: 

          showFab
              ? FloatingActionButton(

                  child: const Icon(Icons.comment, color: Colors.white),
                  onPressed: () {
                    var bottomSheetController =
                        _scaffoldKey.currentState.showBottomSheet(
                      (context) => Container(
                        color: Colors.pink.withOpacity(
                            0.2), //Theme.of(context).accentColor.withOpacity(0.5),
                        //backgroundColor: Theme.of(context).accentColor.withOpacity(0.5),
                        height: MediaQuery.of(context).size.height,
                        width: MediaQuery.of(context).size.width,
                        child: Form(
                          key: _formAddPlayerKey,
                          child: Column(
                            mainAxisAlignment: MainAxisAlignment.start,
                            children: <Widget>[

                              SizedBox(
                                height: 10,
                              ),
                              Container(

                                color: Colors.white.withOpacity(0.5),

                                //Colors.white,
                                margin: EdgeInsets.all(16.0),
                                child: TextFormField(
                                  maxLines: 4,
                                  style: TextStyle(
                                    fontWeight: FontWeight.bold,
                                    fontSize: 30,
                                  ),
                                  decoration: InputDecoration(
                                    hoverColor: Colors.white,
                                    fillColor: Colors.white,
                                    labelText: 'Observation',
                                    border: OutlineInputBorder(),
                                    prefixIcon: Icon(Icons.note),
                                  ),
                                  keyboardType: TextInputType.text,
                                  initialValue:
                                      'My observation....',
                                  validator: (value) {
                                    return validateMyValue(value);
                                  },
                                  onSaved: (value) =>
                                      _MyValue = value,
                                ),
                              ),
                            ],
                          ),
                        ),
                      ),
                    );

                    showFoatingActionButton(false);

                    /// close ?



                    bottomSheetController.closed.then((value) {
                      showFoatingActionButton(true);
                    });
                  })
              : Container(),

      bottomNavigationBar: _buildBottomNavigationBar(context),
      body: _buildBody(context),
    );
  }

  void showFoatingActionButton(bool value) {
    setState(() {
      showFab = value;
    });
  }

1 Ответ

0 голосов
/ 13 февраля 2020

Просто определите свой ключ формы глобально, то есть в классе State

var _formAddPlayerKey = GlobalKey<FormState>();

Если вы хотите проверить свою форму с помощью соответствующего ключа, вам просто нужно набрать это,

bool validate = _formAddPlayerKey.currentState.validate();

Если для логической переменной validate задано значение true, ваша форма соответствует оценкам, а если проверка не пройдена, она автоматически устанавливает сообщения об ошибках, которые вы уже определили в свойстве validate виджета TextFormField

...