如何在自定义TextField中设置controller和focusnode - Flutter------。

问题描述 投票:1回答:1

我正试图创建带有下拉列表的自定义TextField小组件,我想给它控制器和focusnode的参数。我想给它控制器和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当有人触碰其中一个选项时,这个类里面的小部件就会出现改变上面写的内容。有没有什么方法可以让我的widget的用户访问我的小部件的 controllerfocusNode 就像TextField一样?

PS:英语不是我的第一语言,我开始用flutter用OOP编程。

编辑一下

在解决了 此处 是github仓库的链接。

flutter controller dropdown textfield
1个回答
1
投票

你可以使用两个单独的对象在 _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,
    );
  }
}

希望能帮助你:)

© www.soinside.com 2019 - 2024. All rights reserved.