如何为自定义Flutter按钮添加内置Padding参数替代Padding组件?
给自定义按钮添加内置Padding参数的实现方案
方案一:改为组合式Widget(推荐,适配你的使用场景)
把SdPrimaryButton改成继承StatelessWidget,自由整合Padding、SizedBox和ElevatedButton,彻底省去嵌套外层组件的麻烦:
class SdPrimaryButton extends StatelessWidget { final String title; final VoidCallback? onPressed; final VoidCallback? onLongPress; final EdgeInsetsGeometry padding; final bool isFullWidth; // 可选参数,控制按钮是否占满父容器宽度 const SdPrimaryButton({ super.key, required this.title, required this.onPressed, this.onLongPress, this.padding = EdgeInsets.zero, // 默认无padding,可自定义 this.isFullWidth = false, // 默认不占满宽度 }); @override Widget build(BuildContext context) { // 基础按钮组件 Widget button = ElevatedButton( onPressed: onPressed, onLongPress: onLongPress, style: ElevatedButton.styleFrom(), child: Text(title), ); // 如果需要占满宽度,包裹SizedBox if (isFullWidth) { button = SizedBox(width: double.infinity, child: button); } // 包裹外层Padding return Padding( padding: padding, child: button, ); } }
调用示例
现在直接设置padding和isFullWidth参数即可,无需再嵌套Padding和SizedBox:
SdPrimaryButton( title: appLocalizations.labelContinue, onPressed: () { if (widget.checkValidation()) { widget.pageController!.nextPage( duration: const Duration(milliseconds: 500), curve: Curves.easeInOut, ); _scrollToTop(); } }, padding: const EdgeInsets.symmetric(horizontal: medium * 2), isFullWidth: true, )
方案二:保留继承ElevatedButton(仅适用于按钮内部padding)
如果只想给按钮内部的文本添加padding,而非外层容器padding,可以直接在styleFrom中传入padding参数:
class SdPrimaryButton extends ElevatedButton { SdPrimaryButton({ required String title, required VoidCallback? onPressed, VoidCallback? onLongPress, Key? key, EdgeInsetsGeometry padding = EdgeInsets.zero, // 添加padding参数 }) : super( key: key, onPressed: onPressed, onLongPress: onLongPress, style: ElevatedButton.styleFrom( padding: padding, // 将padding应用到按钮内部 ), child: Text(title), ); }
内容的提问来源于stack exchange,提问作者Kathrin
相关产品推荐
相关产品推荐

