Flutter -子级中的空检查操作符错误,不应呈现

quhf5bfb  于 2022-12-24  发布在  Flutter
关注(0)|答案(3)|浏览(223)

我做了一个Loader小部件,如果isLoading = true,它会显示一个加载指示器,如果isLoading = false,它会显示一个子小部件。
问题是当我在子对象中使用可空数据时,即使isLoading = true应该阻止子对象被渲染,Flutter仍然给我Null check operator used on a null value和一个红色屏幕。
示例:

class Example extends StatelessWidget {
  const Example({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    String? data = null; // Just an example

    return Loader(
      isLoading: data == null,
      child: Text(data!), // Flutter will parse this even though Loader never attempted to render it
    );
  }
}

这是我的Loader小部件:

class Loader extends StatelessWidget {
  const Loader({
    Key? key,
    required this.isLoading,
    required this.child,
  }) : super(key: key);

  final bool isLoading;
  final Widget child;

  @override
  Widget build(BuildContext context) {
    if (isLoading) {
      return CircularProgressIndicator();
    else {
      return child;
    }
  }
}
  • 注意:我希望Loader作为 Package 器来清理我的代码,因为我的isLoading、Loader和数据要复杂得多。*
eyh26e7m

eyh26e7m1#

你可以重构你的Loader来使用构建器:

class Loader extends StatelessWidget {
  const Loader({
    Key? key,
    required this.isLoading,
    required this.builder,
  }) : super(key: key);

  final bool isLoading;
  final WidgetBuilder builder;

  @override
  Widget build(BuildContext context) {
    if (isLoading) {
      return CircularProgressIndicator();
    } else {
      return builder(context);
    }
  }
}

那就像这样

class Example extends StatelessWidget {
  const Example({
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    String? data = null; // Just an example

    return Loader(
      isLoading: data == null,
      builder: (_) => Text(data!),
    );
  }
}
3df52oht

3df52oht2#

尝试解析代码时会发生这种情况,即使该部分代码未呈现,因为dart null安全策略不接受null值上的!。因此,这不是Loader小工具中的问题,这是在您尝试传递的子对象内部。尝试如下设置默认值:

return Loader(
  isLoading: data == null,
  child: Text(data ?? ''), //<--- add this
);
xam8gpfp

xam8gpfp3#

null小部件为null时,您可以使用??设置要在Text小部件中显示的默认值,方法如下:

return Loader(
  isLoading: data == null,
  child: Text(data ?? "default data"), 
);

相关问题