• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Flutter+getX实现异步任务竞态更新-已过期的不再允许更新

武飞扬头像
埃尼游
帮助1

代码只是单纯的吧javascript核心代码转换成dart的语法,几乎完全不变
文件import './utils/demoUtils.dart';


辅助函数

  1.  
     
  2.  
    Function competeUpdate() {
  3.  
    dynamic cleanup; //永远存储最新的
  4.  
    //返回的函数里面接受个回调函数
  5.  
    update(Function cb) {
  6.  
    onInvalidate(Function fn) {
  7.  
    cleanup = fn;
  8.  
    }
  9.  
     
  10.  
    //如果该变量存在值,就执行,也就是把上一个队列里面的状态改为无效
  11.  
    if (cleanup!=null) {
  12.  
    cleanup();
  13.  
    }
  14.  
    //回调函数马上执行,且传递一个函数
  15.  
    //被传递的函数是用来更新内部变量的
  16.  
     
  17.  
    cb(onInvalidate);
  18.  
    }
  19.  
    return update;
  20.  
    }
学新通

controler:

  1.  
    import 'package:flutter/material.dart';
  2.  
    import 'package:get/get.dart';
  3.  
     
  4.  
    import '../../../utils/demoUtils.dart';
  5.  
     
  6.  
    class MyController1 extends GetxController{
  7.  
    final _change=competeUpdate();
  8.  
    var demoVal="0".obs;///测试demo
  9.  
    ///开启三个异步任务,第三个比前面两个响应速度快
  10.  
    ///用来模拟正式接口响应数据
  11.  
    void changeStart(){
  12.  
    _change((Function onInvalidate) async {
  13.  
    var inValid = false;
  14.  
    onInvalidate((){
  15.  
    inValid=true;
  16.  
    });
  17.  
    String num = await setDelay1(3,"第一次请求");
  18.  
    if(!inValid){
  19.  
    demoVal.value=num;
  20.  
    }
  21.  
    else{
  22.  
    debugPrint("第一个请求得到值【$num】,但是更改被放弃");
  23.  
    }
  24.  
    });
  25.  
    _change((Function onInvalidate) async {
  26.  
    var inValid = false;
  27.  
    onInvalidate((){
  28.  
    inValid=true;
  29.  
    });
  30.  
    String num = await setDelay1(2,"第二次请求");
  31.  
    if(!inValid){
  32.  
    demoVal.value=num;
  33.  
    }
  34.  
    else{
  35.  
    debugPrint("第二个请求得到值【$num】,但是更改被放弃");
  36.  
    }
  37.  
    });
  38.  
    _change((Function onInvalidate) async {
  39.  
    var inValid = false;
  40.  
    onInvalidate((){
  41.  
    inValid=true;
  42.  
    });
  43.  
    String num = await setDelay1(1,"最新请求");
  44.  
    if(!inValid){
  45.  
    demoVal.value=num;
  46.  
    }
  47.  
    else{
  48.  
    debugPrint("第三次请求得到值【$num】,但是更改被放弃");
  49.  
    }
  50.  
    });
  51.  
    }
  52.  
    ///模拟接口响应数据
  53.  
    Future setDelay1(int second,String str){
  54.  
    return Future.delayed( Duration(seconds: second), (){
  55.  
    return str;
  56.  
    });
  57.  
    }
  58.  
    }
学新通

page:

  1.  
    import 'package:demo/pages/libsPage/GexPages/MyController1.dart';
  2.  
    import 'package:flutter/material.dart';
  3.  
    import 'package:get/get.dart';
  4.  
     
  5.  
    class GetControllerDemo1 extends StatefulWidget {
  6.  
    const GetControllerDemo1({Key? key}) : super(key: key);
  7.  
     
  8.  
    @override
  9.  
    State<GetControllerDemo1> createState() => _GetControllerDemo1State();
  10.  
    }
  11.  
     
  12.  
    class _GetControllerDemo1State extends State<GetControllerDemo1> {
  13.  
    MyController1 myController1 = Get.put(MyController1());
  14.  
     
  15.  
    @override
  16.  
    Widget build(BuildContext context) {
  17.  
    return Scaffold(
  18.  
    appBar: AppBar(title: const Text("GetController第一种使用方式")),
  19.  
    body: Obx(() => Column(children: [
  20.  
    Text("竞态更新数值:${myController1.demoVal.value}"),
  21.  
    OutlinedButton(
  22.  
    onPressed: () {
  23.  
    myController1.changeStart();
  24.  
    },
  25.  
    child: const Text("开启竞态更新demo"))
  26.  
     
  27.  
    ])));
  28.  
    }
  29.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghfiak
系列文章
更多 icon
同类精品
更多 icon
继续加载