Flutter入门学习——Flutter和Dart

因为工作的需要,也为了个人发展,现在的话,转战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.finalconst 关键字 声明一个变量

如果您从未打算更改一个变量,那么使用 finalconst,不是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.dynamicObject 声明一个对象

Object 是 Dart 所有对象的根基类,也就是说在 Dart 中所有类型都是Object的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object声明的对象。 dynamicObject声明的变量都可以赋值任意对象,且后期可以改变赋值的类型,这和 var 是不同的,如:

Dart 复制代码
dynamic t;
Object x;
t = "hi world";
x = 'Hello Object';
//下面代码没有问题
t = 1000;
x = 1000;

dynamicObject不同的是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常用的开发组件,常用库的使用,自己平时开发中的一些点

相关推荐
奶香臭豆腐24 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
m0_748256782 小时前
WebGIS实战开源项目:智慧机场三维可视化(学习笔记)
笔记·学习·开源
南七澄江3 小时前
各种网站(学习资源及其他)
开发语言·网络·python·深度学习·学习·机器学习·ai
机智的叉烧9 小时前
前沿重器[57] | sigir24:大模型推荐系统的文本ID对齐学习
人工智能·学习·机器学习
量子-Alex10 小时前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
吉大一菜鸡10 小时前
FPGA学习(基于小梅哥Xilinx FPGA)学习笔记
笔记·学习·fpga开发
爱吃西瓜的小菜鸡12 小时前
【C语言】判断回文
c语言·学习·算法
小A15913 小时前
STM32完全学习——SPI接口的FLASH(DMA模式)
stm32·嵌入式硬件·学习
岁岁岁平安13 小时前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入