Flutter中PreferredSize包裹自定义AppBar仍要求PreferredSizeWidget怎么办
错误原因
Scaffold的appBar参数要求接收PreferredSizeWidget?类型的组件,你定义的_buildAppBar方法显式声明了返回值为Widget,即使方法内部实际返回的是实现了PreferredSizeWidget的PreferredSize组件,也会被向上转型为普通Widget,因此触发类型不匹配的报错。
解决方案
最简单的改法是直接修改_buildAppBar方法的返回值类型,将Widget替换为PreferredSizeWidget即可,不需要调整方法内部的实现代码:
// 仅修改方法返回值类型即可 PreferredSizeWidget _buildAppBar(BuildContext context) { return PreferredSize( child: Container( padding: EdgeInsets.only(left: 8, right: 8, top: 0), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ ToolbarItemAlwaysOnTop(), Expanded(child: Container()), // ToolbarItemSponsor(), ToolbarItemSettings( onSettingsPageDismiss: () { setState(() {}); }, ), ], ), ), preferredSize: Size.fromHeight(34), ); }
如果不想修改方法返回值,也可以在给appBar参数传值时做一次类型转换:
@override Widget build(BuildContext context) { return SafeArea(child: Scaffold( // 调用时强转类型 appBar: _buildAppBar(context) as PreferredSizeWidget, body:_buildBody(context), )); }
更推荐第一种修改方法返回值的方案,类型安全更高,不会出现运行时强转失败的风险。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

