Flutter 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(

在我的flatter中启用dart null安全后,动画生成器中出现了这个错误,因为我的一个插件需要它

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?
作为参数。非常感谢。好的,我将基于此写一个答案。:)我通常让编译器为这些类型推断出正确的类型,除非它猜错了或奇怪。我用这种方式省去了打字(故意过载)。