Почему использование StatelessWidget прекрасно работает здесь? - PullRequest
0 голосов
/ 26 апреля 2020

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

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final appTitle = 'Form Validation Demo';

    return MaterialApp(
      title: appTitle,
      home: Scaffold(
        appBar: AppBar(
          title: Text(appTitle),
        ),
        body: MyCustomForm(),
      ),
    );
  }
}

class MyCustomForm extends StatelessWidget {
  final _formKey = GlobalKey<FormState>();
  final _textKey = GlobalKey<FormFieldState<String>>();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          TextFormField(
            key: _textKey,
            validator: (value) {
              if (value.isEmpty) {
                return 'Please enter some text';
              }
              return null;
            },
          ),
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 16.0),
            child: RaisedButton(
              onPressed: () {
                if (_formKey.currentState.validate()) {
                  Scaffold.of(context)
                      .showSnackBar(SnackBar(content: Text(_textKey.currentState.value)));
                }
              },
              child: Text('Submit'),
            ),
          ),
        ],
      ),
    );
  }
}

В документации они используют StatefulWidget с State, где я просто использую StatelessWidget. Есть ли причина, по которой StatelessWidget работает в этом случае, и почему мы должны использовать StatefulWidget?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2020

Нет необходимости использовать виджет с отслеживанием состояния. Вы сами решаете, нужно ли вашему классу расширять виджет с сохранением состояния или виджет без сохранения состояния.

Виджет с сохранением состояния используется, когда вы уверены, что в вашем классе произойдет изменение данных, и вам необходимо перестроить пользовательский интерфейс (например, флаттер). привет мир приложение). с другой стороны, виджет без сохранения состояния используется, когда вы знаете, что ваш класс не изменит пользовательский интерфейс (например, экран spla sh с одним изображением).

В этом примере оба могут выполнять работу прекрасно. Данные не изменяются, поэтому можно использовать без сохранения состояния, также можно использовать с сохранением состояния.

Подробнее о виджеты с состоянием и виджеты без состояния и другие решения состояния управление

1 голос
/ 26 апреля 2020

Класс Form представляет собой StatefulWidget

Обратите внимание на наследование:

Объект> Diagnosticable> DiagnosticableTree> Widget> StatefulWidget> Form

Вся работа с состоянием в этом примере содержится в области действия Form.

Если вы хотите сохранить состояние внутри части MyCustomForm, но за пределами Form, то вам придется изменить MyCustomForm на StatefulWidget.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...