如何使TextField的suffixIcon覆盖整个suffixIcon区域?

4 浏览
0 Comments

如何使TextField的suffixIcon覆盖整个suffixIcon区域?

我正在尝试设计一个带有按钮作为后缀图标的TextField。问题是按钮不能完全覆盖后缀图标区域。

考虑以下示例:

class ActionableTextField extends StatelessWidget {

const ActionableTextField({

super.key,

required this.labelText,

required this.controller,

required this.prefixIcon,

required this.suffixIcon,

required this.onPressed,

});

final TextEditingController controller;

final VoidCallback onPressed;

final IconData prefixIcon;

final IconData suffixIcon;

final String labelText;

@override

Widget build(BuildContext context) {

return TextField(

controller: controller,

decoration: InputDecoration(

labelText: labelText,

border: const OutlineInputBorder(),

prefixIcon: Icon(prefixIcon),

suffixIcon: ElevatedButton(

onPressed: onPressed,

child: Icon(suffixIcon),

),

),

);

}

}

如果你查看`ActionableTextField`的实际渲染输出,你会注意到`ElevatedButton`不能完全覆盖后缀图标区域。如何解决这个问题?

期望的渲染输出应该如下所示:

![enter image description here](https://i.stack.imgur.com/RpZNL.png)

实际的渲染输出如下所示:

![enter image description here](https://i.stack.imgur.com/E7Kjx.png)

0
0 Comments

问题出现的原因是希望让TextField的suffixIcon覆盖整个suffixIcon区域,但默认情况下suffixIcon的大小是根据其内容自动确定的,不能覆盖整个区域。

解决方法是利用suffixIconConstraints属性,在InputDecoration中设置一个BoxConstraints,将其最小高度设置为55。这样可以强制按钮的最小高度为55,实现与所需设计类似的效果。

以下是示例代码中对TextField进行封装的一个类ActionableTextField,其中使用了上述解决方法:

class ActionableTextField extends StatelessWidget {

const ActionableTextField({

super.key,

required this.labelText,

required this.controller,

required this.prefixIcon,

required this.suffixIcon,

required this.onPressed,

});

final TextEditingController controller;

final VoidCallback onPressed;

final IconData prefixIcon;

final IconData suffixIcon;

final String labelText;

Widget build(BuildContext context) {

return TextField(

controller: controller,

decoration: InputDecoration(

labelText: labelText,

border: const OutlineInputBorder(),

prefixIcon: Icon(prefixIcon),

suffixIconConstraints: const BoxConstraints(minHeight: 55),

suffixIcon: ElevatedButton(

onPressed: onPressed,

child: Icon(suffixIcon),

),

),

);

}

}

除此之外,还有其他相关问题可以进一步修改该解决方法,包括:

- 如何使按钮的宽度与父元素相匹配?

- 如何设置按钮的宽度和高度?

- Flutter中如何使按钮扩展到其父元素的大小?

以上都是一些相关问题的链接,可以进一步了解和修改解决方法。

0