【问题标题】:Why is key required in constructor?为什么构造函数中需要密钥?
【发布时间】:2021-08-12 04:38:42
【问题描述】:

我创建了扩展StatefulWidget的类

class RegistrationPage extends StatefulWidget {
  final String email;

  const RegistrationPage({Key key, required this.email}) : super(key: key);

  @override
  _RegistrationPage createState() => _RegistrationPage();
}

问题是 android studio 强迫我把 required 放在 Key key 之前。我在谷歌上搜索了一些如何将值从屏幕传递到另一个屏幕的示例,但我从未见过有人使用过 Key。 我这样做:

Navigator.push(
        context,
        new MaterialPageRoute(
          builder: (context) => RegistrationPage(email: email),
        ),
      );

所以只是为了传递电子邮件值。我需要使 Key 可以为空才能使其工作。 我做错了吗?

【问题讨论】:

  • 键应该可以为空。小部件超级构造函数使用可为空的键。

标签: flutter dart dart-null-safety


【解决方案1】:

Key key 设为可空并没有做错任何事情。 super 构造函数,您传递密钥以接受可空类型。

所以

const RegistrationPage({Key? key, required this.email}) : super(key: key);

是规范,因为没有理由通过使其不可为空和必需来限制类型。

如果您不需要此小部件的键,则可以完全省略 super 构造函数和 key 参数。

【讨论】:

    【解决方案2】:

    我认为您的项目是空安全的,在空安全的情况下,变量或对象不能为空,除非它被声明为可空。 尝试在Key 之后添加?

    class RegistrationPage extends StatefulWidget {
      final String email;
    
      const RegistrationPage({Key? key, required this.email}) : super(key: key);
    
      @override
      _RegistrationPage createState() => _RegistrationPage();
    }
    

    或者您可以简单地删除密钥覆盖:

    class RegistrationPage extends StatefulWidget {
      final String email;
    
      const RegistrationPage({required this.email});
    
      @override
      _RegistrationPage createState() => _RegistrationPage();
    }
    

    我建议你阅读https://dart.dev/null-safety/understanding-null-safety

    【讨论】:

    • 但是如果我删除密钥就可以了吗?一切都会正常运行吗?
    • @traki111 是的,除非您打算使用密钥,否则您不需要它。
    • 是的,如果你没有使用 key,它会在没有任何覆盖的情况下工作
    • @traki111 请查看我的答案中的链接,以了解有关 null 安全性的更多信息。从现在开始,所有颤振项目都将默认为空安全。
    【解决方案3】:

    因为您使用的是 null 安全 Dart,而 key 不能是 null,因为它具有不可为 null 的类型 Key

    解决方案:

    • 使用required

      FooPage({required Key key});
      
    • 使key 可以为空。

      FooPage({Key? key});
      
    • 完全删除key

      FooPage();
      

    【讨论】:

    • 哪个更好。我知道我需要添加'?' or required`
    • @traki111 如果您确定要使用key,请使用required,如果绝对不会,请删除key,如果您不确定使用Key?。我已经提供了所有三种可能的解决方案。
    猜你喜欢
    • 2020-03-10
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多