flutter 即使我执行了空值检查[重复],Dart分析仍显示空值错误

eiee3dmh  于 2023-05-19  发布在  Flutter
关注(0)|答案(4)|浏览(144)

此问题已在此处有答案

Null check doesn't cause type promotion in Dart(3个答案)
3天前关闭。
我已经执行了一个空检查,但我仍然得到下面的错误。

error: The argument type 'String?' can't be assigned to the parameter type 'String'. (argument_type_not_assignable at [sitewalk] lib/modules/floor_plan/widgets/dialog_nested/dialog_nested.dart:122)

为了更好地理解,下面是屏幕截图:

现在如果我使用null assertion operator(!),错误将消失。但是我想知道为什么它一开始就给出一个错误?
这是因为如果我们使用多线程,这个值可以改变,这可能会导致错误?

ffx8fchx

ffx8fchx1#

原因实际上是Test类的子类可能会用一个getter覆盖字段,而getter并不总是给予相同的值。就像这样:

class Test2 extends Test {
  const Test2({super.key, super.errormessage});

  @override
  String? get errorMessage => Random().nextBool() ? null : 'aaa';
}

在这种情况下,null检查可能第一次通过,但是当为Text获取它时,它可能返回null

hfyxw5xn

hfyxw5xn2#

您需要一个变量,它被认为是类型从String?提升到String的候选变量。最简单的方法是有一个局部变量:

@override
Widget build(BuildContext context) {
  final localErrorMessage = errorMessage;
  if(localErrorMessage == null) {
    return SizedBox.shrink();
  } else {
    return Text(localErrorMessage);
  }
}
ttygqcqt

ttygqcqt3#

使用此代码

class MyClass extends StatelessWidget {
  final String? errorMessage;
  const MyClass({Key? key, this.errorMessage,}) : super(key: key);
    @override
     Widget build(BuildContext context) {
      if (errorMessage == null) {
      return const SizedBox.shrink();
    } else {
      return Text("$errorMessage");
    }
  }
}

玩得开心

wooyq4lh

wooyq4lh4#

你可以这样做:
将bang运算符放在'errorMessage'的末尾

class Test extends StatelessWidget {
  final String? errorMessage;

  const Test({
    Key? key,
    this.errorMessage,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    if (errorMessage == null) {
      return const SizedBox.shrink();
    } else {
      return Text(errorMessage!);
    }
  }
}

相关问题