在使用Flutter的使用,需要实现点击输入框,然后底部出现菜单弹窗,那么首先就需要做到以下几点:
1、文本输入框不能编辑,只能点击
2、选择器选择之后,文本输入框的值要同步更新
那么就需要使用到TextFormField
和showModalBottomSheet
,功能很好实现,难点是怎么禁用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);
});
},
)
],
);
});
},
),
)),
);
}
}
网友评论