Dart 空安全中断动画生成器

时间:2021-04-26 08:08:07

标签: flutter dart dart-null-safety

在 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 安全之前,一切正常。

1 个答案:

答案 0 :(得分:1)

问题在于 builder 中的参数 AnimatedBuilder,采用具有以下签名的 TransitionBuilder 函数:

Widget TransitionBuilder (
    BuildContext context,
    Widget? child
) 

https://api.flutter.dev/flutter/widgets/TransitionBuilder.html

在具有空安全性的 Dart 2.12 中,Widget? 表示 child 可以指向 Widgetnull 类型的对象。但是在您的情况下,您有一个带有签名的方法:

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){