美文网首页
Flutter 实现输入框选择器的功能

Flutter 实现输入框选择器的功能

作者: 码字与律动 | 来源:发表于2020-08-12 14:05 被阅读0次

在使用Flutter的使用,需要实现点击输入框,然后底部出现菜单弹窗,那么首先就需要做到以下几点:
1、文本输入框不能编辑,只能点击
2、选择器选择之后,文本输入框的值要同步更新

那么就需要使用到TextFormFieldshowModalBottomSheet,功能很好实现,难点是怎么禁用TextFormField的光标?我看了TextFormField源码,发现里面有个enabled,将其设置为false,确实禁用了TextFormField的操作,可是点击事件一下子也禁用了,这就无法点击显示选择器弹窗了。这时,我又想到,能不能使用GestureDetector组件对TextFormField外包一层,然后提供点击事件,事实上却没有成功,这个还是要好好想下原因?

最后,使用笨方法,是研究TextFormField组件源码,对可能的属性一个个试了,才发现readOnly只读这个参数设置了,就达到了禁止输入,但是点击事件还是生效的目的的,实现该功能,完整代码如下:

import 'package:flutter/material.dart';

class TextFormFieldPage extends StatefulWidget {
  @override
  _TextFormFieldPageState createState() => _TextFormFieldPageState();
}

class _TextFormFieldPageState extends State<TextFormFieldPage> {
  final TextEditingController _controller = new TextEditingController();

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _controller.text = "男";
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("输入框选择器"),
        centerTitle: true,
      ),
      body: Container(
          child: Padding(
        padding: EdgeInsets.all(16),
        child: TextFormField(
          controller: _controller,
          readOnly: true,
          decoration: InputDecoration(labelText: "性别", hintText: "请选择性别"),
          onTap: () {
            showModalBottomSheet(
                context: context,
                builder: (BuildContext context) {
                  return Column(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      ListTile(
                        title: Text("男"),
                        onTap: () {
                          setState(() {
                            _controller.text = "男";
                            Navigator.pop(context);
                          });
                        },
                      ),
                      ListTile(
                        title: Text("女"),
                        onTap: () {
                          setState(() {
                            _controller.text = "女";
                            Navigator.pop(context);
                          });
                        },
                      ),
                      ListTile(
                        title: Text("不告诉你"),
                        onTap: () {
                          setState(() {
                            _controller.text = "不告诉你";
                            Navigator.pop(context);
                          });
                        },
                      )
                    ],
                  );
                });
          },
        ),
      )),
    );
  }
}

源码:flutter_basic_example

相关文章

网友评论

      本文标题:Flutter 实现输入框选择器的功能

      本文链接:https://www.haomeiwen.com/subject/qjgpdktx.html