封装showModalBottomSheet为全局方法后无法返回String值问题
问题描述
点击Future类型的showModalBottomSheet内的按钮后需要返回一个String值,直接在onPressed中实现时能正常获取返回值,但封装为全局调用的showReturnStringBottomSheet方法后,调用该方法始终返回null而非预期字符串。
直接实现的代码
onPressed: () async { String? returnString = await showModalBottomSheet<String>( context: context, isDismissible: false, builder: (ctx) { return StatefulBuilder(builder: (ctx, setState) { return Container( margin: EdgeInsets.all(10), padding: EdgeInsets.all(10), child: ElevatedButton( onPressed: (){ Navigator.pop(ctx, "This is return string bla bla bla"); }, child: Text("Click Me To Return"), ), ); }); }, ); Logger().i("PrintReturnString: $returnString"); Logger().i("PrintReturnStringRunTimeType: ${returnString.runtimeType}"); }
封装后的全局方法(错误版本)
showReturnStringBottomSheet(ctx) async { await showModalBottomSheet<String>( context: ctx, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(25))), elevation: 5, isDismissible: true, isScrollControlled: true, builder: (ctx) { return StatefulBuilder(builder: (ctx, setState) { return Container( margin: EdgeInsets.all(10), padding: EdgeInsets.all(10), child: ElevatedButton( onPressed: (){ Navigator.pop(ctx, "This is return string bla bla bla"); }, child: Text("Click Me To Return"), ), ); }); } ); }
调用封装方法的代码
onPressed: () async { String? returnString = await showReturnStringBottomSheet(context); }
问题原因与解决方法
错误原因
封装的showReturnStringBottomSheet方法仅执行了showModalBottomSheet,但没有将该方法的返回值(也就是Navigator.pop传递的字符串)返回给调用者。Dart中异步方法如果没有显式return语句,默认返回null,这就是调用后得到null的核心原因。
修正方法
在封装方法中添加return关键字,将showModalBottomSheet的执行结果传递出去,同时建议指定方法的返回类型,提升代码可读性与类型安全性:
// 修正后的全局方法 Future<String?> showReturnStringBottomSheet(BuildContext ctx) async { // 添加return,将showModalBottomSheet的返回值传递给调用方 return await showModalBottomSheet<String>( context: ctx, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(25))), elevation: 5, isDismissible: true, isScrollControlled: true, builder: (ctx) { return StatefulBuilder(builder: (ctx, setState) { return Container( margin: EdgeInsets.all(10), padding: EdgeInsets.all(10), child: ElevatedButton( onPressed: (){ Navigator.pop(ctx, "This is return string bla bla bla"); }, child: Text("Click Me To Return"), ), ); }); } ); }
内容的提问来源于stack exchange,提问作者Emmanuel Njorodongo
相关产品推荐
相关产品推荐

