User interface 我如何制作TextField';s后缀/后缀是否可以调整高度大小?

User interface 我如何制作TextField';s后缀/后缀是否可以调整高度大小?,user-interface,flutter,textfield,flutter-layout,User Interface,Flutter,Textfield,Flutter Layout,如何强制check_circle图标自动调整大小以匹配实际文本字段的高度,即wrt其光标高度?请改用sufficicon import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp(

如何强制check_circle图标自动调整大小以匹配实际文本字段的高度,即wrt其光标高度?

请改用
sufficicon

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          body: Column(
            children: [
              Container(
                color: Colors.orange,
                child: TextField(
                  decoration: InputDecoration(
                    suffix: IconButton(
                        icon: Icon(Icons.check_circle),
                        onPressed: () {
                          print('222');
                        }),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

改为使用
subfixicon

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          body: Column(
            children: [
              Container(
                color: Colors.orange,
                child: TextField(
                  decoration: InputDecoration(
                    suffix: IconButton(
                        icon: Icon(Icons.check_circle),
                        onPressed: () {
                          print('222');
                        }),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
很好的问题

最基本的是重置文本字段中的所有填充,而不是使用图标按钮(因为所有材质组件都有预定义的填充和内部填充,您无法修改)

似乎后缀将基线与文本对齐,从而阻止材质墨水交互,而后缀将在文本区域中正确居中,但会将墨水传播到文本字段。 所以,到目前为止,我还没有找到一个正确的方法,也许我缺少一个小部件/逻辑

检查底部的屏幕截图,该截图显示了后缀无法与文本对齐的原因,因为它位于基线内,插入符号生成的高度更大

在前两个文本字段中,灰色框为后缀,黄色框为后缀(正确居中)

解决方案1:(在屏幕快照中,M是带2个复选框的红色背景) 如果可以(按设计),请排成一行,并放置文本字段和图标:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          body: Column(
            children: [
              Container(
                color: Colors.orange,
                child: TextField(
                  decoration: InputDecoration(
                    suffixIcon: IconButton(
                        icon: Icon(Icons.check_circle),
                        onPressed: () {
                          print('222');
                        }),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
解决方案3:

用你自己制作的装饰品

问得好

最基本的是重置文本字段中的所有填充,而不是使用图标按钮(因为所有材质组件都有预定义的填充和内部填充,您无法修改)

似乎后缀将基线与文本对齐,从而阻止材质墨水交互,而后缀将在文本区域中正确居中,但会将墨水传播到文本字段。 所以,到目前为止,我还没有找到一个正确的方法,也许我缺少一个小部件/逻辑

检查底部的屏幕截图,该截图显示了后缀无法与文本对齐的原因,因为它位于基线内,插入符号生成的高度更大

在前两个文本字段中,灰色框为后缀,黄色框为后缀(正确居中)

解决方案1:(在屏幕快照中,M是带2个复选框的红色背景) 如果可以(按设计),请排成一行,并放置文本字段和图标:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SafeArea(
        child: Scaffold(
          body: Column(
            children: [
              Container(
                color: Colors.orange,
                child: TextField(
                  decoration: InputDecoration(
                    suffixIcon: IconButton(
                        icon: Icon(Icons.check_circle),
                        onPressed: () {
                          print('222');
                        }),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
解决方案3:

用你自己制作的装饰品


使用的
堆栈

var inputBorderDecoration = OutlineInputBorder(
        borderRadius: BorderRadius.zero,
        borderSide: BorderSide(width: 1, color: Colors.black));

    double fontSize = 24;
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: Container(
        color: Colors.green.shade50,
        child: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Container(
                width: 300,
                height: fontSize,
                color: Colors.orange,
                child: TextField(
                  style: TextStyle(fontSize: fontSize, color: Colors.white),
                  decoration: InputDecoration(
                    fillColor: Colors.purple.withOpacity(.5),
                    filled: true,
                    border: inputBorderDecoration,
                    focusedBorder: inputBorderDecoration,
                    enabledBorder: inputBorderDecoration,
                    contentPadding: EdgeInsets.zero,
                    suffixIcon: GestureDetector(
                      onTap: () => print('on tap'),
                      child: Container(
                        color: Colors.green,
                        child: FittedBox(
                          alignment: Alignment.center,
                          fit: BoxFit.fitHeight,
                          child: IconTheme(
                            data: IconThemeData(),
                            child: Icon(
                              Icons.check_circle,
                              color: Colors.white,
                            ),
                          ),
                        ),
                      ),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );

已使用
堆栈

var inputBorderDecoration = OutlineInputBorder(
        borderRadius: BorderRadius.zero,
        borderSide: BorderSide(width: 1, color: Colors.black));

    double fontSize = 24;
    return GestureDetector(
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: Container(
        color: Colors.green.shade50,
        child: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Container(
                width: 300,
                height: fontSize,
                color: Colors.orange,
                child: TextField(
                  style: TextStyle(fontSize: fontSize, color: Colors.white),
                  decoration: InputDecoration(
                    fillColor: Colors.purple.withOpacity(.5),
                    filled: true,
                    border: inputBorderDecoration,
                    focusedBorder: inputBorderDecoration,
                    enabledBorder: inputBorderDecoration,
                    contentPadding: EdgeInsets.zero,
                    suffixIcon: GestureDetector(
                      onTap: () => print('on tap'),
                      child: Container(
                        color: Colors.green,
                        child: FittedBox(
                          alignment: Alignment.center,
                          fit: BoxFit.fitHeight,
                          child: IconTheme(
                            data: IconThemeData(),
                            child: Icon(
                              Icons.check_circle,
                              color: Colors.white,
                            ),
                          ),
                        ),
                      ),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );

那是行不通的;图标大小保持不变,与“手机辅助功能设置”中指定的字体大小无关。这不起作用;图标大小保持不变,与“手机辅助功能设置”中指定的字体大小无关。感谢您提供了如此详尽的答案,但当我将textScaleFactor调到2.0时,文本从容器中出来。感谢您提供了如此详尽的答案,但当我将textScaleFactor调到2.0时,文本从容器中出来。