Flutter开发中是否可以向PreferredSizeWidget传递参数?
解决方案
你要的传参效果完全可以实现,Dart支持通过返回Widget的函数实现类似的入参传递逻辑,不用将originAppBar声明为固定的PreferredSizeWidget变量即可:
- 把原来的变量改成接收
BuildContext参数的函数,返回你需要的AppBar实例:
PreferredSizeWidget originAppBar(BuildContext context) { return AppBar( centerTitle: true, backgroundColor: Colors.white, // 此处可正常使用传入的context调用Navigator相关逻辑 leading: IconButton( onPressed: () => Navigator.of(context).pushNamed(Profile.route), icon: const Icon(Icons.person), ), title: ... // 保留你原来的title逻辑 ); }
- 调用方式和你给出的C#示例完全一致,在build方法中将当前上下文传入即可:
@override Widget build(BuildContext context) { return Scaffold( appBar: originAppBar(context), // 其余页面逻辑 body: ... ); }
补充说明
如果需要扩展更多自定义配置,还可以给函数增加额外参数,比如动态传入标题、是否显示返回按钮等:
PreferredSizeWidget originAppBar(BuildContext context, { required String title, bool showBackButton = true, }) { return AppBar( centerTitle: true, backgroundColor: Colors.white, leading: showBackButton ? const BackButton() : null, title: Text(title), actions: [ IconButton( onPressed: () => Navigator.of(context).pushNamed(Profile.route), icon: const Icon(Icons.person), ) ], ); } // 调用时按需传参 appBar: originAppBar(context, title: "首页", showBackButton: false),
不建议将AppBar声明为作用域外固定变量的核心原因有两个:一是拿不到当前页面的BuildContext,二是固定变量不会跟随页面状态更新重新构建,容易出现状态不同步的问题,用函数返回Widget的方式可以完美规避这两个问题。
内容的提问来源于stack exchange,提问作者Beginner_
相关产品推荐
相关产品推荐

