Flutter 将字段文本缩小到比hintText小的宽度
我将链接创建一个收缩到内部文本的Flutter 将字段文本缩小到比hintText小的宽度,flutter,dart,textfield,Flutter,Dart,Textfield,我将链接创建一个收缩到内部文本的TextField。 为了做到这一点,我使用了一个小部件。 它工作得很好,但是如果我指定一个hintText,即使用户输入很短的文本,TextField的宽度也不会小于hintText的宽度 以下是一个例子: 导入“包装:颤振/材料.省道”; void main()=>runApp(MyApp()); 类MyApp扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( 家:脚手架( 正文:中( 子:容器( 对齐:对齐.center, 身高:50,
TextField
。
为了做到这一点,我使用了一个小部件。
它工作得很好,但是如果我指定一个hintText
,即使用户输入很短的文本,TextField
的宽度也不会小于hintText
的宽度
以下是一个例子:
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
正文:中(
子:容器(
对齐:对齐.center,
身高:50,
宽度:300,
子:容器(
对齐:对齐.center,
填充:边缘设置。全部(10),
颜色:颜色。灰色[100],
子:内部宽度(
孩子:TextField(
装饰:输入装饰(
hintText:'我的非常长的提示',//删除它,文本字段可以和里面的文本一样小
),
),
),
),
),
),
),
);
}
}
这是一个没有提示的文本字段和一个小文本: 文本字段的宽度是内部文本的宽度,这是我想要的。✔️
以下是带有提示的空字段: 当没有文本时,文本字段的宽度就是提示的宽度,这就是我想要的。✔️
下面是带有提示的文本字段,提示为长文本: 字段的宽度是内部文本的宽度,这是我想要的。✔️
这是一个非空字段,带有提示和小文本: 正如您所看到的,字段宽度是提示的宽度,而不是内部的文本(这不是我想要的)❌).
如何将其强制为内部实际文本的宽度?您可以根据
文本编辑控制器的内容有条件地更改hintText
:
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
void main() => runApp(MyApp());
class MyApp extends HookWidget {
@override
Widget build(BuildContext context) {
final _controller = useTextEditingController();
final _editing = useState(false);
_controller.addListener(() => _editing.value = _controller.text.isNotEmpty);
return MaterialApp(
home: Scaffold(
body: Center(
child: Container(
alignment: Alignment.center,
width: 300,
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.all(10),
color: Colors.grey[100],
child: Column(
children: [
IntrinsicWidth(
child: TextFormField(
controller: _controller,
decoration: InputDecoration(
hintText: _editing.value
? '' // empty hintText if field is not empty
: 'My very very long hint',
),
),
),
],
),
),
),
),
),
);
}
}
您可以根据text编辑控制器的内容有条件地更改hintText
:
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
void main() => runApp(MyApp());
class MyApp extends HookWidget {
@override
Widget build(BuildContext context) {
final _controller = useTextEditingController();
final _editing = useState(false);
_controller.addListener(() => _editing.value = _controller.text.isNotEmpty);
return MaterialApp(
home: Scaffold(
body: Center(
child: Container(
alignment: Alignment.center,
width: 300,
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.all(10),
color: Colors.grey[100],
child: Column(
children: [
IntrinsicWidth(
child: TextFormField(
controller: _controller,
decoration: InputDecoration(
hintText: _editing.value
? '' // empty hintText if field is not empty
: 'My very very long hint',
),
),
),
],
),
),
),
),
),
);
}
}
1.将字段宽度设置为文本的宽度,而不是提示的宽度
这可以通过在TextField小部件中使用onChanged()函数实现,如下所示
为了能够使用setState,MyApp类需要是一个StatefulWidget
onChanged: (value) => {
if (value.isNotEmpty) {
setState(() {
hText = '';
})
} else {
setState(() {
hText = 'My very very long hint';
})
}
}
2.包装文本字段的两个容器
我注意到,尽管使用了IntrinsicWidth,但这两个容器限制了文本字段的大小
onChanged: (value) => {
if (value.isNotEmpty) {
setState(() {
hText = '';
})
} else {
setState(() {
hText = 'My very very long hint';
})
}
}
如果使用容器设置文本字段可见,另一种方法是设置文本字段的边框
脚手架的主体可以如下所示:
Center(
child: IntrinsicWidth(
child: TextField(
onChanged: (value) => {
if (value.isNotEmpty) {
setState(() {
hText = '';
})
} else {
setState(() {
hText = 'My very very long hint';
})
}
},
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.teal),
),
hintText:
hText, // Remove it and the text field can be as small as the text inside
),
),
),
)
完整代码
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
String hText='My very very long hint';
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
正文:中(
子:内部宽度(
孩子:TextField(
一旦更改:(值)=>{
if(value.isNotEmpty)
{
设置状态(){
hText='';
})
}
其他的
{
设置状态(){
hText=‘我的非常长的提示’;
})
}
},
装饰:输入装饰(
enabledBorder:UnderlineInputBorder(
borderSide:borderSide(颜色:Colors.black),
),
//当TextFormField处于焦点时
FocusedOrder:下划线输入边框(
borderSide:borderSide(颜色:Colors.teal),
),
hintText:
hText,//删除它,文本字段可以和里面的文本一样小
),
),
),
),
),
);
}
}
1.将字段宽度设置为文本的宽度,而不是提示的宽度
这可以通过在TextField小部件中使用onChanged()函数实现,如下所示
为了能够使用setState,MyApp类需要是一个StatefulWidget
onChanged: (value) => {
if (value.isNotEmpty) {
setState(() {
hText = '';
})
} else {
setState(() {
hText = 'My very very long hint';
})
}
}
2.包装文本字段的两个容器
我注意到,尽管使用了IntrinsicWidth,但这两个容器限制了文本字段的大小
onChanged: (value) => {
if (value.isNotEmpty) {
setState(() {
hText = '';
})
} else {
setState(() {
hText = 'My very very long hint';
})
}
}
如果使用容器设置文本字段可见,另一种方法是设置文本字段的边框
脚手架的主体可以如下所示:
Center(
child: IntrinsicWidth(
child: TextField(
onChanged: (value) => {
if (value.isNotEmpty) {
setState(() {
hText = '';
})
} else {
setState(() {
hText = 'My very very long hint';
})
}
},
decoration: InputDecoration(
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.black),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.teal),
),
hintText:
hText, // Remove it and the text field can be as small as the text inside
),
),
),
)
完整代码
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
String hText='My very very long hint';
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
正文:中(
子:内部宽度(
孩子:TextField(
一旦更改:(值)=>{
if(value.isNotEmpty)
{
设置状态(){
hText='';
})
}
其他的
{
设置状态(){
hText=‘我的非常长的提示’;
})
}
},
装饰:输入装饰(