【问题标题】:How to set controller and focusnode in custom TextField - Flutter如何在自定义 TextField 中设置控制器和焦点节点 - Flutter
【发布时间】:2020-05-01 21:00:32
【问题描述】:

我正在尝试使用下拉列表创建我的自定义 TextField 小部件。我想给它控制器和焦点节点的参数。我不希望它们是必需的,但如果它们不是,我不能为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)。有什么方法可以让我的小部件用户访问 controllerfocusNode,就像 TextField 一样?

PS:英语不是我的第一语言,我开始使用 Flutter 使用 OOP 进行编程。

编辑:

解决方案here之后是github存储库的链接。

【问题讨论】:

    标签: flutter controller dropdown textfield


    【解决方案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,
        );
      }
    }
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 2016-10-23
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多