Flutter使用rflutter_alert自定义弹窗报错及不显示问题如何解决?
报错原因
Alert.show()方法的返回值是Future<bool?>类型,你原代码将其作为StatelessWidget的build方法返回值,而build要求返回Widget类型,类型不匹配就是你看到报错的直接原因。- 你将弹窗封装成了组件类,但在
updateProduct方法里直接实例化类,没有将其插入到当前页面的组件树中,build方法根本不会执行,所以弹窗不会显示。
解决方案(完全保留你原有调用格式)
第一步:修改DialogueTwoButton类定义
不需要继承StatelessWidget,直接做成工具类,构造时自动触发弹窗显示:
class DialogueTwoButton { DialogueTwoButton( {required BuildContext context, required this.text1, required this.text2, required this.onpres1, required this.onpress2}) { // 构造时直接调用弹窗显示逻辑 _onAlertButtonsPressed(context, text1, text2, onpres1, onpress2); } final String text1; final String text2; final Function onpres1; final Function onpress2; final alertStyle = AlertStyle( animationType: AnimationType.fromTop, isCloseButton: false, isOverlayTapDismiss: false, descStyle: GoogleFonts.montserrat(color: Colors.black, fontSize: 18), titleStyle: GoogleFonts.montserrat( color: Colors.red, ), ); _onAlertButtonsPressed(BuildContext context, String desc, String title, Function onPressYes, Function onPressNo) { Alert( context: context, style: alertStyle, title: title, desc: desc, buttons: [ DialogButton( child: Text( "Yes", style: GoogleFonts.montserrat(color: Colors.white, fontSize: 18), ), onPressed: onPressYes, color: HexColor("#5344ed")), DialogButton( child: Text( "No", style: GoogleFonts.montserrat(color: Colors.white, fontSize: 18), ), onPressed: onPressNo, color: HexColor("#5344ed"), ) ], ).show(); } }
第二步:调整调用逻辑,补充传入context
仅需补传context参数,其余调用逻辑和你原有写法完全一致:
updateProduct(BuildContext context) { DialogueTwoButton( context: context, onpres1: () {}, onpress2: () {}, text1: 'df', text2: 'dsf', ); } // 按钮调用处传入当前页面context bottomButton(context, () { updateProduct(context); }, "Update Product"),
内容的提问来源于stack exchange,提问作者TimeToCode
相关产品推荐
相关产品推荐

