Flutter使用PreferredSizeWidget搭配CupertinoNavigationBar类型报错如何解决
报错原因
Dart的三目运算符在进行类型推断时,会将两个分支返回值的公共父类作为整体表达式的返回类型。
CupertinoNavigationBar和AppBar虽然都单独实现了PreferredSizeWidget接口,但二者的公共父类是Widget,因此三目运算整体返回值类型为Widget,无法直接赋值给声明为PreferredSizeWidget的变量,就会触发该类型不匹配错误。
可行解决方案
方案1:对三目运算的两个分支单独强制类型转换
直接给两个分支分别添加as PreferredSizeWidget强转声明,明确告知Dart编译器两个分支的类型都符合PreferredSizeWidget要求,改动量最小:
final PreferredSizeWidget appBar = Platform.isIOS ? CupertinoNavigationBar( // 你的原有CupertinoNavigationBar配置代码 ) as PreferredSizeWidget : AppBar( // 你的原有AppBar配置代码 ) as PreferredSizeWidget;
该方案不需要修改后续其他调用appBar.preferredSize的代码。
方案2:拆分变量声明,避免三目运算符的类型推断问题
不用三目运算符统一赋值,分开判断平台后分别声明赋值,不会触发类型向上推断的问题,无强制类型转换风险,更推荐使用:
late final PreferredSizeWidget appBar; if (Platform.isIOS) { appBar = CupertinoNavigationBar( // 你的原有CupertinoNavigationBar配置代码 ); } else { appBar = AppBar( // 你的原有AppBar配置代码 ); }
方案3:将变量类型改为Widget,使用时再强转
把appBar的变量类型声明为Widget,后续需要调用preferredSize属性的地方再临时强转,适合后续不需要频繁调用preferredSize的场景:
final Widget appBar = Platform.isIOS ? CupertinoNavigationBar(/* 原有配置代码 */) : AppBar(/* 原有配置代码 */); // 后续用到preferredSize的地方修改为如下写法: (appBar as PreferredSizeWidget).preferredSize.height
内容的提问来源于stack exchange,提问作者Manan Patel
相关产品推荐
相关产品推荐

