为什么构造函数中需要密钥?

Why is key required in constructor?

我创建了 class 扩展 StatefulWidget

class RegistrationPage extends StatefulWidget {
  final String email;

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

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

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

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

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

因为您正在使用 null-safe Dart 并且 key 不能 null 因为它具有不可为空的类型 Key.

解决方案:

  • 使用required

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

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

    FooPage();
    

我认为您的项目处于空安全状态,具有空安全的变量或对象不能为空,除非它被声明为可为空。 尝试在 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

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

所以

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

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

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