在 Flutter 中启用 dart null 安全后,我在 Animated Builder 中收到此错误,因为我的一个插件需要它。
return AnimatedBuilder(
//animation is done here
animation:_pageController,
builder: (BuildContext context,Widget widget){
double value = 1;
if(_pageController.position.haveDimensions){
value = _pageController.page! - index;
value = (1-(value.abs()*0.25)).clamp(0.0, 1.0);
}
return Center(
child: SizedBox(
height:Curves.easeInOut.transform(value)*380.0,
child: widget,
),
);
},
我收到这样的错误:
<块引用>不能将参数类型“Center Function(BuildContext, Widget)”分配给参数类型“Widget Function(BuildContext, Widget?)”。
在我在 pubspec.yaml 中启用 dart null 安全之前,一切正常。
答案 0 :(得分:1)
问题在于 builder
中的参数 AnimatedBuilder
,采用具有以下签名的 TransitionBuilder
函数:
Widget TransitionBuilder (
BuildContext context,
Widget? child
)
https://api.flutter.dev/flutter/widgets/TransitionBuilder.html
在具有空安全性的 Dart 2.12 中,Widget?
表示 child
可以指向 Widget
或 null
类型的对象。但是在您的情况下,您有一个带有签名的方法:
Widget (BuildContext context,Widget widget)
其中 Widget
表示它将始终指向 Widget
对象,因此永远不会是 null
。因此,此签名与 builder
所需的签名不兼容。
在您的情况下,修复相当简单,因为您仅使用参数 widget
将其转发到 child
构造函数中的 SizedBox
参数。此构造函数具有以下签名:
const SizedBox(
{Key? key,
double? width,
double? height,
Widget? child}
)
https://api.flutter.dev/flutter/widgets/SizedBox/SizedBox.html
如您所见,child
的类型为 Widget?
,因此允许将 null
作为值。因此,您可以将作为 builder
参数提供的方法的参数类型更改为:
builder: (BuildContext context,Widget? widget){