Можно ли использовать TextEditingController в StatelessWidget во Flutter? - PullRequest
0 голосов
/ 25 апреля 2020

Мне не нужно делать много вещей с TextEditingController, но я хочу показать исходный текст. И я чувствую, что создание StatefulWidget слишком много для этого. Вот что я хочу, чтобы мой код выглядел как

// In StatelessWidget
TextField(
    controller: TextEditingController(),
)

Но все увиденные мною учебники и посты блога используют TextEditingController в StatefulWidget и располагают их в методе dispose. Но я не могу избавиться от них, если я использую как указано выше

1 Ответ

0 голосов
/ 25 апреля 2020

Если вы хотите использовать TextEditingController, нет другого выхода, кроме как использовать StatefulWidget, если вы хотите избежать утечек памяти.

Однако, если вы видите много шаблонного в этом подходе, Вы можете использовать HookWidget ( flutter_hooks ), который дает вам простой доступ к TextEditingController и предоставляет его вам, вот сравнение:

с использованием StatefulWidget:

class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  TextEditingController controller;
  FocusNode focusNode;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: TextField(
            focusNode: focusNode,
            controller: controller,
          ),
        ),
      ),
    );
  }

  @override
  void initState() {
    controller = TextEditingController();
    focusNode = FocusNode();
    super.initState();
  }

  @override
  void dispose() {
    controller.dispose();
    focusNode.dispose();
    super.dispose();
  }
}

с использованием HookWidget:

class Test extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final focusNode = useFocusNode();
    final controller = useTextEditingController();
      return Scaffold(
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: TextField(
            focusNode: focusNode,
            controller: controller,
          ),
        ),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...