Flutter Dart null安全性中断动画生成器
在我的flatter中启用dart null安全后,动画生成器中出现了这个错误,因为我的一个插件需要它Flutter Dart null安全性中断动画生成器,flutter,dart,dart-null-safety,Flutter,Dart,Dart Null Safety,在我的flatter中启用dart null安全后,动画生成器中出现了这个错误,因为我的一个插件需要它 return AnimatedBuilder( //animation is done here animation:_pageController, builder: (BuildContext context,Widget widget){ double value = 1; if(
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,
),
);
},
我得到的错误如下:
无法将参数类型“中心函数(BuildContext,Widget)”分配给参数类型“Widget函数(BuildContext,Widget?”
在我在pubspec.yaml中启用dart null安全之前,一切正常。问题在于
AnimatedBuilder
中的参数builder
采用了带有以下签名的TransitionBuilder
函数:
Widget TransitionBuilder (
BuildContext context,
Widget? child
)
Widget (BuildContext context,Widget widget)
const SizedBox(
{Key? key,
double? width,
double? height,
Widget? child}
)
在具有空安全性的Dart 2.12中,Widget?
表示child
可以指向Widget
或null
类型的对象。但在您的情况下,您有一个带有签名的方法:
Widget TransitionBuilder (
BuildContext context,
Widget? child
)
Widget (BuildContext context,Widget widget)
const SizedBox(
{Key? key,
double? width,
double? height,
Widget? child}
)
其中Widget
意味着它将始终指向Widget
对象,因此永远不能为null
。因此,此签名与builder
所需的签名不兼容
在您的例子中,修复相当简单,因为您只使用参数小部件
将其转发到大小框
构造函数中的子
参数中。此构造函数具有以下签名:
Widget TransitionBuilder (
BuildContext context,
Widget? child
)
Widget (BuildContext context,Widget widget)
const SizedBox(
{Key? key,
double? width,
double? height,
Widget? child}
)
如您所见,child
被键入为Widget?
,因此允许null
作为值。因此,您只需将作为builder
参数提供的方法的参数类型更改为:
builder: (BuildContext context,Widget? widget){
我想如果你在定义
builder
的行中将Widget
更改为Widget?
就行了,因为SizedBox
中的child
被允许将Widget?
作为参数。非常感谢。好的,我将基于此写一个答案。:)我通常让编译器为这些类型推断出正确的类型,除非它猜错了或奇怪。我用这种方式省去了打字(故意过载)。