Как установить контроллер и focusnode в пользовательском TextField - Flutter - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь создать свой собственный виджет TextField с выпадающим списком. Я хочу привести аргументы контроллера и focusnode. Я не хочу, чтобы они были обязательными, но если это не так, я не могу установить их для Controller() и FocusNode(). И я не могу иметь их со значением null, потому что я уже работаю с ними в классе. Я не уверен, как это сделать. Вот что у меня есть:

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

class DropdownText extends StatefulWidget {
  final TextEditingController controller;
  final FocusNode focusNode;

  const DropdownText({Key key, this.controller, this.focusNode}) : super(key: key);
  @override
  _DropdownTextState createState() => _DropdownTextState();
}

class _DropdownTextState extends State<DropdownText> {

  bool _show = false;

  @override
  void initState() {
    super.initState();

    widget.focusNode.addListener(listener);
  }

  void listener(){
    if(widget.focusNode.hasFocus){
      setState(() {
        _show = true;
      });
    }else{
      setState(() {
        _show = false;
      });
    }
  }

}

И я уже работаю с текстом моего TextField (используя controller.text) внутри этого класса, когда кто-то касается одного из вариантов изменения написанного на нем. Могу ли я предоставить пользователю моего виджета доступ к controller и focusNode так же, как это делает TextField?

PS: Engli sh не мой родной язык, и я начало программирования с помощью OOP с флаттером.

Редактировать:

После решения здесь - ссылка на репозиторий github.

1 Ответ

1 голос
/ 02 мая 2020

Вы можете использовать два отдельных объекта в _DropdownTextState и инициализировать их в initState().

Извлечь код ниже.

class _DropdownTextState extends State<DropdownText> {
  TextEditingController _controller;
  FocusNode _focusNode;

  bool _show = false;

  @override
  void initState() {
    super.initState();
    if (widget.controller != null)
      _controller = widget.controller;
    else
      _controller = TextEditingController();
    if (widget.focusNode != null)
      _focusNode = widget.focusNode;
    else
      _focusNode = FocusNode();

    _focusNode.addListener(listener);
  }

  @override
  void dispose() {
    super.dispose();
    _controller?.dispose();
    _focusNode?.dispose();
  }

  void listener() {
    if (widget.focusNode.hasFocus) {
      setState(() {
        _show = true;
      });
    } else {
      setState(() {
        _show = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      focusNode: _focusNode,
      controller: _controller,
    );
  }
}

Надеюсь, это поможет:)

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