Flutter网络

1、获取测试数据

2、集成网络请求工具

  • Dart库
  • pubspec.yaml文件,cupertino_icons: 中贴入库名与版本号,Pub get即可

3、模型转换

3.1、Map转Json

  • json.encode(value);

3.2、Json转Map

  • json.decode(value);

image.png

3.3、创建特定模型(传参,返回特定值)

image.png

4、异步

  • 多线程是包含A、B、C多个进程,异步是A进程下a、b、c任务
  • 定义的方法后加async,耗时操作前加await表示等待耗时操作结束后再进行下一步。
  • Dart规定async标记的异步函数,只能由await来调用,不加await则按同步函数顺序执行

image.png

4.1、Future

  • 未来获取数据,内部已经被包装成异步的,单独使用时加不加async没影响

  • await:设置等待Future包装的任务完成后,再执行下边代码,与async搭配使用 image.png

    • 后边任务必须是异步才能用await修饰
    • 当前函数也必须是异步函数
    • 会阻塞后边所有代码执行,如果该函数中还有要先执行的其他代码则可不用await,而改用.then(value) => 待耗时操作结束后执行的代码
  • .then(value)中的valueFuture内最终return的值,但如果有异常,那么.then()不执行 getoataO;.png

  • .then(类型 value) {代码}.catchError((errorMessage){代码}).whenComplete((){代码}).timeout(Duration(seconds: 1));

    • 不初始化直接链式调用 image.png

    • 初始化后对实例链式调用 image.png

    • 一个任务一个任务的执行 image.png

    • 多个Future都完成后再执行 image.png

  • ,onError:(){}.catchError()区别:onError(){} 一次就结束,.catchError() 是链式,可多次使用

4.2、FutureBuilder

  • 异步渲染,最终内部要return一个widget
  • 不复杂界面使用效率高,不需要对状态、数据进行存储
4.2.1、snapshot.connectionState
  • 异步渲染状态 image.png
4.2.2、snapshot.data
  • 异步渲染数据 image.png

4.3、scheduleMicrotask(callback):微任务

  • Flutter有两种队列,一个是事件队列,一个是微任务队列,微任务队列优先级高于事件队列 image.png
  • .then() 其实也是微任务,Future加载后将.then()加入微任务队列,所以优先级很高

注:

  • sleep()会阻塞主线程

5、多线程

5.1、特点与对比异步

  • 异步是单线程的,Flutter多线程更类似于多进程,因为各线程有独立的内存空间
  • 因为内存独立,所以无法直接调用修改,也没有抢占资源的问题,因此没有锁!

5.2、修改内容

5.2.1、Isolate:隔离
  • 因为内存独立,将内部与外部隔离,因此修改内容需要通讯
  • 使用后,端口要关闭线程要kill

image.png

  • ReceivePort(); 创建端口
  • Isolate.spawn(func,port); 创建线程,执行一个将端口作为参数的方法
  • port.listen((message){代码}); 监听端口内容
  • port.send(message); 发送端口内容
5.2.2、compute(func,param)
  • 可以直接接收子线程的变量
  • 内部是对Isolate的封装,在compute(func,param)中修改外部变量不生效

image.png

6、状态保持

  • 混入AutomaticKeepAliveClientMixin

image.png

个人学习,仅供参考,持续修改

猜你喜欢

转载自juejin.im/post/7031508106739712031