好的网站开发培训茶叶网站建设策划书
好的网站开发培训,茶叶网站建设策划书,哪些是+joomla做的网站,中煤建设协会网站Dart 空安全#xff1a;
空类型操作符 (?)空值合并操作符 (??)空值断言操作符 (!)延迟初始化 (late)
1、空类型操作符 (?)
当你想要根据一个表达式是否为 null 来执行某个操作时#xff0c;你可以使用 (?)语法#xff1a;expression1?.expression2如果 expression1…Dart 空安全
空类型操作符 (?)空值合并操作符 (??)空值断言操作符 (!)延迟初始化 (late)
1、空类型操作符 (?)
当你想要根据一个表达式是否为 null 来执行某个操作时你可以使用 (?)语法expression1?.expression2如果 expression1 不是 null则执行 expression2 并返回其结果。如果 expression1 是 null则直接返回 null并且不会执行 expression2。
String? name;int? length name?.length;
// 如果 name 是 nulllength 也会是 null
// 如果 name 不是 nulllength 将会是 name 的长度2、空值合并操作符 (??)
当你想要为一个可能为 null 的表达式提供一个默认值时你可以使用 (??)语法expression1 ?? expression2如果 expression1 不是 null则返回 expression1 的值。如果 expression1 是 null则返回 expression2 的值。
String? name getName();
String fullName name ?? Unknown;
// 如果 name 是 null则 fullName 为 Unknown
// 如果 name 不是 null则 fullName 为 name 的值3、空值断言操作符 (!)
当你确定一个表达式不应该为 null但编译器无法确定时你可以使用!来告诉编译器你确信该表达式不是 null语法expression!使用此操作符时你应确保表达式确实不是 null否则在运行时会出现 NullPointerException
String? name getName();
int length name!.length;
// 确信 name 不是 null并获取其长度
// 如果 name 是 null则会报错 NullPointerException补充(!) 取反用法
void main(){String name leon;if(name is! String){print(其他类型);}else{print(String类型);}
}
//输出String类型4、延迟初始化 (late)
当你在声明变量时使用 late 关键字你告诉 Dart 编译器该变量将在稍后的某个时间点被初始化而不是在声明时立即初始化
void main() { late String name; // 声明一个late变量此时不需要初始化 if (someCondition) { name Alice; // 在某个条件满足时进行初始化 } else { name Bob; // 在另一个条件满足时进行初始化 } print(name); // 使用已经初始化的变量
} bool someCondition true; // 假设这是某个条件实际情况中可能根据逻辑判断来设置在 Flutter 中 State 的 initState 方法中初始化的一些变量是比较适合使用 late 来进行延时初始化的因为在 Widget 生命周期中 initState 方法是最先执行的所以它里面初始化的变量通过 late 修饰后既能保障使用时的便利又能防止空异常
class _TravelPgeState extends StateTravelPge with TickerProviderStateMixin {late TabController _controller;overridevoid initState() {super.initState();_controller TabController(length: 0, vsync: this);}...5、补充Widget 生命周期
在 Flutter 中Widget 并不直接具有生命周期因为 Widget 是不可变的immutable然而Flutter 中的 StatefulWidget 和 State 对象确实具有生命周期因为 StatefulWidget 可以创建和管理一个可变的状态对象State
当你插入一个 StatefulWidget 到 Flutter 的 widget 树时Flutter 会进行以下操作
创建Create
StatefulWidget 的实例被创建createState() 方法被调用以创建一个新的 State 对象initState() 方法在 State 对象上被调用你可以在这里进行初始化操作
插入Insert
StatefulWidget 和它的 State 对象被插入到 widget 树中build() 方法在 State 对象上被调用以构建 widget 树
更新Update
当 StatefulWidget 的依赖项发生变化时Flutter 会重新构建 widget 树build() 方法会再次被调用但 State 对象不会改变如果你想根据新的依赖项更新 State你可以调用 setState(() {})这将导致 build() 方法再次被调用但 initState() 不会被调用
移除Remove
当 StatefulWidget 从 widget 树中移除时Flutter 会调用 dispose() 方法。你可以在这里释放任何资源或执行任何必要的清理操作
注意build() 方法在整个生命周期中可能会被多次调用而 initState() 和 dispose() 方法每个 State 对象只会被调用一次。
class LifecycleWidget extends StatefulWidget { override _LifecycleWidgetState createState() _LifecycleWidgetState();
} class _LifecycleWidgetState extends StateLifecycleWidget { override void initState() { super.initState(); print(initState called); // 初始化代码 } override Widget build(BuildContext context) { print(build called); return Container( padding: const EdgeInsets.all(16.0), child: Text(Lifecycle Widget), ); } override void dispose() { super.dispose(); print(dispose called); // 清理代码 }
}在这个例子中当你插入 LifecycleWidget 到 Flutter 应用中时你会看到 “initState called” 和 “build called” 打印出来如果依赖项发生变化并触发重建只有 “build called” 会再次打印当你从 widget 树中移除 LifecycleWidget 时“dispose called” 会打印出来。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89327.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!