Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 将字段文本缩小到比hintText小的宽度_Flutter_Dart_Textfield - Fatal编程技术网

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=‘我的非常长的提示’;
})
}
},
装饰:输入装饰(