You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:54:04