Flutter(三)——一篇文章掌握Dart语言的用法(三)

简介: Flutter(三)——一篇文章掌握Dart语言的用法(三)

异步编程


Dart语言和JavaScript语言的共同点是单线程,同步代码会阻塞程序,因此程序里能看到大量的异步操作,它是用Future对象来执行相关操作的,并且async函数使用await关键字时才被执行,直到一个Future操作完成,Future支持链式操作的方式,可以按顺序执行异步操作。


Future是什么?

一个Future是一个Future自身的泛型Flutter对象,它表示一个异步操作产生的T类型的结果,如果结果的值不可用,Future的类型会是Future,如果返回一个Future的函数被调用了,将会发生以下两件事:


(1)这个函数加入待完成的队列并且返回一个未完成的Future对象


(2)当这个操作结束了,Future对象返回一个值或者错误。


例如:


Future<int> future=getFuture();
future.then((value)=>handleValue(value))
  .catchError((error)=>handleError(error))
  .whenComplete()=>handlerComplete();


如果你是前端的开发人员,可以理解Future类似前端里的Promise。我们在future.then中接收异步处理结果,并根据业务需求做相应的处理。而future.catchError则用于在异步函数中捕获并处理错误。在有些业务场景下,无论是异步任务的处理结果是成功还是失败,我们都需要再进行一些处理,这时候可以使用Future的whenComplete进行回调。


async和await

当遇到需要延迟的运算(async)时,将其放到延迟运算的队列(await)中去,把不需要延迟的运算的部分先执行完,最后在来处理延迟的运算部分。但是,要使用await,就必须在有async标记的函数中运行,否则这个await会报错。


其实这个和JavaScript也很像,async和await是Future的语法糖(Syntacticsugar),解决了回调地狱(Callback Hell)的问题。


那么回调地狱又是什么?这个需要结合具体业务场景来说,比如“业务1->业务2->业务3”,这三个任务都是异步的,那么业务1成功之后调用业务1的then回调,然后业务1的then里面在调用业务2,依次类推,就形成了回调地狱。回调地狱多了之后,我们的代码会非常难看,因为需要大量的缩进,比如这种:

step1('step1').then(step1Result(){
  step2('step2').then(step2Result(){
  step3('step3').then(step3Result(){
    //依次类推456....
  })
  })
})


我们刚在上面讲解了async和await是Future的语法糖,我们在使用过程中给人的感觉是在调用同步的代码。为了解决这种回调地狱,我们对以上代码结构进行了一些调整,修改后的代码如下:

steps() async{
  try{
  String step1Result=await step1('step1');
  String step2Result=await step2(step1Result);
  String step3Result=await step3(step2Result);
  //456......
  }catch(e){
  print(e);
  }
}


从上面的代码我们可以看到,await必须被包裹在async里面,如果没有async就会报错。后续我们将通过其他章节在进行详细的使用。


继承,接口实现

在Dart语言中,继承和接口实现基本上与Java类似,但是我们需要注意以下几点:


(1)继承:构造函数不能被继承,而且在Dart语言中,没有Java中的公有与私有的修饰符,因此,可以直接访问超类中的所有变量与方法。


(2)接口实现:在Dart语言中,没有接口的修饰符,但是每个类都是一个隐式的接口,这个接口包含类里的所有成员变量与方法,当类被当作接口使用的时候,类中的方法就是接口中的方法,它需要在子类里重新被实现,而且实现的时候需要加上@override关键字。


使用方式如下:

abstract class A{
  void printA();
}
class B{
  void printB(){
  }
}
class C{
  void printC(){
  print('C');
  }
}
class SoftwareSngineer extends C implements A,B{
  @override
  void printA{
  //重写
  }
  @override
  void printB(){
  //重写
  }
}


混合

在Dart语言中,我们有一个新的特性,那就是混合的语言特性mixins,它的作用是在类中混入其他功能,mixins最早出现在Lisp语言中。你可以这么来理解,就是在面向对象的语言中,mixins是一个可以把自己的方法提供给其他类使用,但却不需要成为其他类的父类的类,它以非继承的方式来复用类中的代码。要使用mixins,则要用关键字with来复用类中的代码,使用方式如下:

abstract class A{
    factory A._(){
        return null;
    }
    void printA(){
        print('A');
    }
}
class C with A{
    @override
    void printA(){
        print('A');
    }
}
void main(){
    C()..printA();
}


那我们现在就有一个疑问了,如果同时使用继承,接口实现与混合,并且@override的方法都一样,那么执行的优先级会怎么样?我们直接上代码跑一下就清楚了:

class Cat{
    void show(){
        print('小猫');
    }
}
class Brid{
    void show(){
        print('小鸟');
    }
}
class Owner{
    void show(){
        print('主人');
    }
}
class person1 extends Owner with Cat,Brid{
    void show(){
        print('主人1养了猫和鸟');
    }
}
class person2 extends Owner with Cat implements Brid{
    void show(){
        print('主人2养了猫和鸟');
    }
}
void main(){
    person1()..show();
    person2()..show();
}


如果代码如上,没有任何注释,那么会直接执行类本身的方法,输出效果如下:


现在我们注释调用两个person中的方法,其他代码不变:


class person1 extends Owner with Cat,Brid{
    //void show(){
        //print('主人1养了猫和鸟');
    //}
}
class person2 extends Owner with Cat implements Brid{
    //void show(){
        //print('主人2养了猫和鸟');
    //}
}


那么现在打印出来的效果就是这样:


从这里我们可以看出来,假如使用了混合,继承与接口实现,那么它的执行优先级顺序是mixins->extends->implements。


泛型

在Dart语言中,泛型与Java中很相似,比如List。用尖括号括起来的就是泛型的写法。在List中,这个E代表泛型的类型,且不一定要用E表示,还可以用T,S,K等表示,我们先来简单的使用一下:

void main(){
  List animals=new List<String>();
  animals.addAll('小猫','小狗','小兔');
}


在上面代码中,我们使用了List集合来存储小动物,并且指定了List泛型,这样定义就说说明只能存储字符串类型。


Dart语言基础就这么多,重点都在后面,前面大部分只要学过其他的语言,看看根本不费劲,Dart语言是Flutter开发的主要语言,必须要掌握的哦。

相关文章
|
1月前
|
前端开发 C++ 容器
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
Flutter-完整开发实战详解(一、Dart-语言和-Flutter-基础)(1)
|
1月前
|
Dart 安全
简化代码、提高效率:Dart和Flutter开发小技巧
在日常开发中,我们常常会使用一些常用的技巧或语法糖,以简化代码、提高开发效率。本文将分享一些在Dart和Flutter中常用的小贴士,帮助你更轻松地编写优雅高效的代码。
简化代码、提高效率:Dart和Flutter开发小技巧
|
9天前
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
|
1月前
|
Dart 测试技术 UED
Dart 和 Flutter 错误处理指南 | 最佳实践全解析
深入探索 Dart 和 Flutter 中的错误处理技术,从编译时错误到运行时异常,带你学习如何优雅地处理应用程序中的各种意外情况。了解最佳实践,让你的应用程序稳如磐石,用户体验持续优化!
Dart 和 Flutter 错误处理指南 | 最佳实践全解析
|
1月前
|
Dart 前端开发 开发者
【Flutter前端技术开发专栏】Flutter Dart语言基础语法解析
【4月更文挑战第30天】Dart是Google为Flutter框架打造的高效编程语言,具有易学性、接口、混入、抽象类等特性。本文概述了Dart的基础语法,包括静态类型(如int、String)、控制流程(条件、循环)、函数、面向对象(类与对象)和异常处理。此外,还介绍了库导入与模块使用,帮助开发者快速入门Flutter开发。通过学习Dart,开发者能创建高性能的应用。
【Flutter前端技术开发专栏】Flutter Dart语言基础语法解析
|
1月前
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求
|
1月前
|
缓存 监控 前端开发
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
【4月更文挑战第30天】本文探讨了Flutter应用启动优化策略,包括理解启动过程、资源加载优化、减少初始化工作、界面布局简化、异步初始化、预加载关键数据、性能监控分析以及案例和未来优化方向。通过这些方法,可以缩短启动时间,提升用户体验。使用Flutter DevTools等工具可助于识别和解决性能瓶颈,实现持续优化。
【Flutter 前端技术开发专栏】Flutter 应用的启动优化策略
|
10天前
|
开发框架 前端开发 测试技术
Flutter开发常见问题解答
Flutter开发常见问题解答
|
17天前
|
Dart 监控 测试技术
在Flutter开发中,注重代码质量与重构实践显得尤为重要
【6月更文挑战第11天】随着Flutter在跨平台开发的普及,保持高质量代码成为开发者关注的重点。良好的代码质量关乎应用性能、稳定性和开发效率。为提升Flutter代码质量,开发者应遵循最佳实践,编写可读性高的代码,实施代码审查和自动化测试。重构实践在应对代码复杂性时也至关重要,包括识别重构时机、制定计划、逐步操作及利用重构工具。注重代码质量和重构是Flutter开发成功的关键。
33 3
|
14天前
|
Dart 前端开发 JavaScript
Flutter for Web:跨平台移动与Web开发的新篇章
Flutter for Web是Google的开源UI工具包Flutter的延伸,用于构建高性能、高保真的跨平台应用,包括Web。它基于Dart语言和Flutter的核心框架,利用Skia渲染引擎通过WebAssembly在Web上运行。开发流程包括安装SDK、创建项目、编写Dart代码和部署。性能优化涉及减少渲染开销、代码压缩等。与传统Web框架相比,Flutter for Web在开发效率和性能上有优势,但兼容性和生态系统尚待完善。
19 0