Appearance
flutter
数据类型
数字类型
js
num num1 = -100; // 是数字类型的父类,有两个子类 int 和 double。
num num2 = 100;
int int1 = 100; //只能是整数
double d1 = 3.1415; //双精度
num1.abs(); //求绝对值
num1.toInt(); //转换成int
num1.toDouble(); //转换成Double
字符串
js
String str1 = '单引号';
String str2 = "双引号";
String str3 = 'st1:$str1 str2:$str2'; //字符串拼接
String str4 = 'st1:' + str1 + ' str2:' + str2; //字符串拼接
//常用方法
print(str5.substring(1, 5)); //字符串截取
print(str5.indexOf('类型')); //获取指定字符串位置
布尔类型
- Dart 是强 bool 类型检查,只有 bool 类型的值是 true 才被认为是 true
js
bool success = true;
bool fail = false;
List 集合
js
List list = [1, 2, 3, '集合']; //初始化时,添加元素
List<int> list2 = []; // 类型约束
List list3 = [];
list3.addAll(list);// 直接添加整个集合
print(list3);
List list4 = List.generate(3, (index) => index * 2);
print(list4);
///遍历集合的方式
for (int i = 0; i < list.length; i++) {
print(list[i]);
}
for (var o in list) {
print(o);
}
list.forEach((val) {
print(val);
});
Map
js
Map names = {'username': 'hu.lei', 'age': 'hulei'};
names['add'] = 'sh'
///Map遍历
ages.forEach((k, v) {
print('$k $v');
});
Map ages2 = ages.map((k, v) {
//迭代生成一个新Map
return MapEntry(v, k);
});
print(ages2);
for (var key in ages.keys) {
print('$key ${ages[key]}');
}
dynamic、var、Object 三者的区别
- dynamic
- dynamic 是动态类型,不建议使用,因为代码静态类型检查不会报错
- var
- var 是一个关键字,会自动类型推导,如果声明的是字符串,在赋值 int 类型,在编译时就会报错
- Object
js
dynamic a1 = 'hu.lei';
print(a1.runtimeType); // String
a1 = 20;
print(a1.runtimeType);// int
a1.fn() // 编译时不会报错,运用时才会报错
js
var a1 = "hu.lei";
print(a1.runtimeType); // String
a1 = 20; // Error: A value of type 'int' can't be assigned to a variable of type 'String'.
js
Object o1 = '11';
print(o1.runtimeType); // String
print(o1.fn()); // Error: The method 'fn' isn't defined for the class 'Object'.
面向对象
js
// 实例化
Student student =Student('hu.lei',20,'东风之星',city:'北京');
student.school; // 调用get取值
student.school = '东风之星'; // 调用set赋值
Student.doPrint('调用静态方法');
print( student.toString());
// 工厂构造实例化
Student factoryStudent = Student.stu(Student('hu.lei',20,'东风之星',city:'北京'));
factoryStudent.school; // 调用get取值
factoryStudent.school = '东风之星'; // 调用set赋值
print( factoryStudent.toString());
// 子类
class Student extends Person{
//定义类的变量
String _school; //通过下划线来标识私有字段(变量) 只能在本类中使用
String city;
// city默认参数
// 如果父类中有构造,必须调用父类的构造
Student(String name,int age,String school, {this.city='上海'}):_school ='$name.$school',super(name, age) {
print('构造方法体不是必须的');
}
// get取值
String get school => _school;
// get设置
set school(String value) {
_school = value;
}
//命名工厂构造方法:类名.方法名调用
factory Student.stu(Student stu) {
return Student(stu.name, stu.age, stu.school, city: stu.city);
}
@override
String toString() {
return '$name $age $_school $city';
}
//静态方法
static doPrint(String str) {
print('doPrint:$str');
}
}
// 父类
class Person{
String name;
int age;
// 有参数构造
Person(this.name,this.age){
}
@override
String toString() {
return '$name $age';
}
}
单例模式
- 是有一个实例对象
js
// 单例
SingletonPattern singletonPattern = SingletonPattern();
SingletonPattern singletonPattern1 = SingletonPattern();
print(singletonPattern==singletonPattern1);
singletonPattern.test();
///工厂构造方法演示
class SingletonPattern {
static final SingletonPattern _singletonPattern =
SingletonPattern._internal();
///工厂构造函数
factory SingletonPattern() {
return _singletonPattern;
}
///构造函数私有化,防止被误创建
SingletonPattern._internal();
void test() {
print("测试");
}
}
继承抽象类
- 被 abstract 修饰的类就是抽象类,抽象类中的方法不能有方法体
- 如果一个类继承一个抽象类,必须实现抽象类中的方法
js
class Dog extends Animal {
@override
void eat() {
print('吃饭');
}
}
abstract class Animal {
void eat();
}
with 关键字
- 类在继承中只能单继承
- 如果一个类中,需要继承多个类的特性,可以用 with
js
class User extends BaseUser with User1,User2 {
}
泛型
- 泛型可以约束类型,可以进行类型推导
js
Cache<String> cache = Cache();
cache.setCache('key1');
print(cache.getCache());
class Cache<T>{
late T key;
setCache(T key){
this.key = key;
}
T getCache(){
return this.key;
}
}
Widget 的生命周期
js
import 'package:flutter/material.dart';
///Flutter Widget的生命周期重点讲解StatefulWidget的生命周期
///因为无状态的widget StatelessWidget只有createElement、与build两个生命周期方法
///StatefulWidget的生命周期方法按照时期不同可以分为三组:
///1.初始化时期
///createState、initState
///2.更新期间
///didChangeDependencies、build、didUpdateWidget
///3.销毁期
///deactivate、dispose
///扩展阅读:
///http://www.devio.org/io/flutter_app/img/blog/flutter-widget-lifecycle.png
///https://flutterbyexample.com/stateful-widget-lifecycle/
class WidgetLifecycle extends StatefulWidget {
const WidgetLifecycle({super.key});
///当我们构建一个新的StatefulWidget时,这个会立即调用
///并且这个方法必须被覆盖
@override
State<WidgetLifecycle> createState() => _WidgetLifecycleState();
}
class _WidgetLifecycleState extends State<WidgetLifecycle> {
int _count = 0;
///这是创建widget时调用的除构造方法外的第一个方法:
///类似于Android的:onCreate() 与iOS的 viewDidLoad()
///在这个方法中通常会做一些初始化工作,比如channel的初始化,监听器的初始化等
@override
void initState() {
print('----initState----');
super.initState();
}
///当依赖的State对象改变时会调用:
///a.在第一次构建widget时,在initState()之后立即调用此方法;
///b.如果的StatefulWidgets依赖于InheritedWidget,那么当当前State所依赖InheritedWidget中的变量改变时会再次调用它
///拓展:InheritedWidget可以高效的将数据在Widget树中向下传递、共享,可参考:https://book.flutterchina.club/chapter7/inherited_widget.html
@override
void didChangeDependencies() {
print('---didChangeDependencies----');
super.didChangeDependencies();
}
///这是一个必须实现的方法,在这里实现你要呈现的页面内容:
///它会在在didChangeDependencies()之后立即调用;
///另外当调用setState后也会再次调用该方法;
@override
Widget build(BuildContext context) {
print('---build-----');
return Scaffold(
appBar: AppBar(
title: const Text('Flutter页面生命周期'),
leading: BackButton(),
),
body: Center(
child: Column(
children: <Widget>[
ElevatedButton(
onPressed: () {
setState(() {
_count += 1;
});
},
child: const Text(
'点我',
style: TextStyle(fontSize: 26),
),
),
Text(_count.toString())
],
),
),
);
}
///这是一个不常用到的生命周期方法,当父组件需要重新绘制时才会调用;
///该方法会携带一个oldWidget参数,可以将其与当前的widget进行对比以便执行一些额外的逻辑,如:
/// if (oldWidget.xxx != widget.xxx)...
@override
void didUpdateWidget(WidgetLifecycle oldWidget) {
print('----didUpdateWidget-----');
super.didUpdateWidget(oldWidget);
}
///很少使用,在组件被移除时调用在dispose之前调用
@override
void deactivate() {
print('-----deactivate------');
super.deactivate();
}
///常用,组件被销毁时调用:
///通常在该方法中执行一些资源的释放工作比如,监听器的卸载,channel的销毁等
@override
void dispose() {
print('-----dispose-----');
super.dispose();
}
}
APP 生命周期
js
import 'package:flutter/material.dart';
class AppLifecycle extends StatefulWidget {
const AppLifecycle({Key? key}) : super(key: key);
@override
_AppLifecycleState createState() => _AppLifecycleState();
}
class _AppLifecycleState extends State<AppLifecycle>
with WidgetsBindingObserver {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter应用生命周期'),
leading: const BackButton(),
),
body: const Text('Flutter应用生命周期'),
);
}
@override
void initState() {
WidgetsBinding.instance.addObserver(this);
super.initState();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print('state = $state');
if (state == AppLifecycleState.paused) {
print('App进入后台');
} else if (state == AppLifecycleState.resumed) {
print('App进去前台');
} else if (state == AppLifecycleState.inactive) {
//不常用:应用程序处于非活动状态,并且未接收用户输入时调用,比如:来了个电话
}
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
flutter sdk 版本
- stable(推荐):为当前最稳定的 channel
- beta:为每月 Flutter 官方调整选出来的最好的 dev 的 channel;
- dev:为当前最新且充分测试后的 channel;
- master:为当前最新的 channel;
npm
# 查看当前Flutte渠道
flutter channel
# 切换Flutte渠道
flutter channel dev
# 更新当前Flutte渠道
flutter upgrade