因为工作的需要,也为了个人发展,现在的话,转战Flutter跨端开发了,虽然目前的项目只发了android端,但是那天尝试了一下Ios的打包流程,也能运行,只是IOS那边的打包稍微复杂一些。
差不多学习了一周了,现在项目也在入手开始写了,总的来说Android转Flutter不难,Android原生应用就是指使用Java或Kotlin语言直接调用Android SDK开发的应用程序;而iOS原生应用就是指通过Objective-C或Swift语言直接调用iOS SDK开发的应用程序,Flutter开发,用心学学很快就上手了,语言虽然用的是Dart,但是很好入门,现在的高阶语言,都是缝合怪。
目前入门的话,有中文的Flutter开发社区,里面的东西简单易懂,可以去看看。
文章仅作个人总结
一、什么是Flutter?
Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter 提供了丰富的组件、接口,开发者可以很快地为 Flutter 添加 Native(即原生开发,指基于平台原生语言来开发应用,flutter可以和平台原生语言混合开发) 扩展
二、Dart语言简介
1、var 关键字 作用:声明一个变量
Dart
var t = "hi world";
// 下面代码在dart中会报错,因为变量t的类型已经确定为String,
// 类型一旦确定后则不能再更改其类型。
t = 1000;
2.final
和const 关键字 声明一个变量
如果您从未打算更改一个变量,那么使用 final
或 const
,不是var
,也不是一个类型。 一个 final
变量只能被设置一次,两者区别在于:const
变量是一个编译时常量(编译时直接替换为常量值),final
变量在第一次使用时被初始化。被final
或者const
修饰的变量,变量类型可以省略,如:
Dart
//可以省略String这个类型声明
final str = "hi world";
//final String str = "hi world";
const str1 = "hi world";
//const String str1 = "hi world";
3.dynamic
和 Object 声明一个对象
Object
是 Dart 所有对象的根基类,也就是说在 Dart 中所有类型都是Object
的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object
声明的对象。 dynamic
与Object
声明的变量都可以赋值任意对象,且后期可以改变赋值的类型,这和 var
是不同的,如:
Dart
dynamic t;
Object x;
t = "hi world";
x = 'Hello Object';
//下面代码没有问题
t = 1000;
x = 1000;
dynamic
与Object
不同的是dynamic
声明的对象编译器会提供所有可能的组合,而Object
声明的对象只能使用 Object
的属性与方法, 否则编译器会报错,如:
Dart
dynamic a;
Object b = "";
main() {
a = "";
printLengths();
}
printLengths() {
// 正常
print(a.length);
// 报错 The getter 'length' is not defined for the class 'Object'
print(b.length);
}
dynamic
的这个特点使得我们在使用它时需要格外注意,这很容易引入一个运行时错误,比如下面代码在编译时不会报错,而在运行时会报错:
Dart
print(a.xx); // a是字符串,没有"xx"属性,编译时不会报错,运行时会报错
4.空安全检查机制(和kotlin一样)
5.函数声明
Dart
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic
处理,注意,函数返回值没有类型推断。函数和kotlin一样可以作为变量,参数进行传递
6.mixin
Dart 是不支持多继承的,但是它支持 mixin,简单来讲 mixin 可以 "组合" 多个类。
类似于kotlin的单继承(extends),多继承(implements)
Dart
class Man extends Person with Eat, Walk, Code{}
7.异步支持
1.Future
Future
表示一个异步操作的最终完成(或失败)及其结果值的表示。简单来说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。一个Future只会对应一个结果,要么成功,要么失败。
1.Future.then
例如:Dio网络请求库中的request方法,返回的就是一个Future对象
Dart
Future<Response<T>> request<T>(
String url, {
Object? data,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
Options? options,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
});
我们在请求一个接口后,调用then方法,接收异步结果
Dart
GlobalRepository.appUpdate().then((ApiModel res) {
//GlobalRepository.appUpdate()是一个Future对象
if (res.apiSuccess()) {
VersionModel resModel = VersionModel.fromJson(res.data);
if (resModel.update == true) {
DialogUtil.showUpdateAppDialog();
}
}
});
直接调用
Dart
Future.delayed(Duration(seconds: 2),(){
return "hi world!";
}).then((data){
print(data);
});
2.Future.catchError
如果异步任务发生错误,我们可以在catchError
中捕获错误,我们将上面示例改为:
Dart
Future.delayed(Duration(seconds: 2),(){
//return "hi world!";
throw AssertionError("Error");
}).then((data){
//执行成功会走到这里
print("success");
}).catchError((e){
//执行失败会走到这里
print(e);
});
3.Future.wait
有些时候,我们需要等待多个异步任务都执行结束后才进行一些操作,可以使用Future.wait
例如项目中,需要同时抓取各种数据,使用此方法,可以等多个接口返回后,在执行下面的代码
2.async/await
消除回调地狱(Callback Hell),类似于C接口等待B接口的结果,B接口等待A接口的结果,在有时候会写出很傻很长的代码。
Dart
task() async {
try{
String id = await login("alice","******");
String userInfo = await getUserInfo(id);
await saveUserInfo(userInfo);
//执行接下来的操作
} catch(e){
//错误处理
print(e);
}
}
-
async
用来表示函数是异步的,定义的函数会返回一个Future
对象,可以使用 then 方法添加回调函数。 -
await
后面是一个Future
,表示等待该异步任务完成,异步完成后才会往下走;await
必须出现在async
函数内部。 -
上面的代码会一行一行的执行
8.循环
Dart
for (var i = 0; i < 10; i++) {
// 循环体
}
var list = [1, 2, 3];
for (var item in list) {
// 循环体
}
while (condition) {
// 循环体
}
do {
// 循环体
} while (condition);
其余好像没啥了,都比较简单。
个人建议,简单的东西,看看文章,官方文档就行了,没必要去看视频啥的,真的慢。
后面会总结flutter常用的开发组件,常用库的使用,自己平时开发中的一些点