Flutter构造函数初始化列表中super(key: key)的作用是什么?
class MyApp extends StatelessWidget { MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { //returns widget } }
- 问题1:是的,这个逻辑就是把MyApp构造函数接收的key参数,传递给父类构造函数的key参数。Dart 2.17及以上版本还支持
super.key的语法糖,可以直接把构造函数写成MyApp({super.key});,实现的效果完全一致。 - 问题2:对,这里调用的就是
StatelessWidget的构造函数。因为MyApp继承自StatelessWidget,super关键字默认指向直接父类,所以super(key: key)就是在调用StatelessWidget的构造函数并传参。 - 问题3:key是Flutter框架用来标识唯一Widget的标记,框架在更新Widget树时,会通过key来精准匹配新旧Widget,正确复用组件状态、避免不必要的重绘。把key传递给父类,就是把这个标识交给Widget基类处理,让框架可以正常识别MyApp的实例。
- 问题4:如果你使用MyApp时从来不会传入key参数,暂时不会出现明显的运行问题。但如果后续有需要用到key的场景,比如用全局key获取组件状态、在动态列表中复用MyApp实例,就会出现key不生效、组件状态错乱、框架匹配错误组件等异常问题。此外Flutter官方的linter规则也会要求子类把key传递给父类构造函数,属于开发的最佳实践。
内容的提问来源于stack exchange,提问作者Ishaan
相关产品推荐
相关产品推荐

