flutter实践:Isolate应用实例二

需求:尝试将Isolate封装一层便于直接使用

实现:

1.定义一个封装类

class TdxIsolate {
  //创建一个isolate
  Isolate? newIsolate;
  //新isolate发送器
  SendPort? childSender;
  //存放结果集
  List results = [];

  //构造方法
  TdxIsolate() {
    //初始化isolate 
    createIsolate();
  }

  void dispose() {
    //界面销毁时一定要释放资源
    newIsolate?.kill(priority: Isolate.immediate);
  }
}

2.消息传递

在 Dart 中,Isolate 之间的消息传递是通过 SendPort 和 ReceivePort 来实现的。

SendPort 和 ReceivePort 是 Dart 中进行进程间通信的工具。

你可以通过 SendPort 发送消息,然后在对应的 ReceivePort 中接收消息。

当你创建一个 ReceivePort 时,它将自动生成一个与之关联的 SendPort。

// 初始化,创建isolate
  Future<void> createIsolate() async {
    //主Isolate的ReceiverPort
    ReceivePort mainReceive = ReceivePort();
    newIsolate =
        await Isolate.spawn<SendPort>(childSearch, mainReceive.sendPort);//主Receive的sendPort传到新Isolate
    //返回的第一个消息
    childSender = await mainReceive.first;
    //关闭
    mainReceive.close();
  }
// 新Isolate的方法,负责处理数据解析
  static childSearch(SendPort mainSendPort) {
    //新Isolate的ReceivePort
    ReceivePort childReceivePort = ReceivePort();
    //新Isolate的sendPort传回主Isolate
    mainSendPort.send(childReceivePort.sendPort);
    // 监听子Isolate的传送装置,等待主isolate叫子Isolate处理数据
    childReceivePort.listen((package) async {
      MessagePackage _msg = package as MessagePackage;
      var sStr = _msg.msg["keys"];
      var aData = _msg.msg["data"];
      _msg.sender.send(getSearchResults(sStr, aData));
    });
  }
//耗时操作,遍历数据
static List getSearchResults(String searchStr, List data) {
    if (searchStr.isEmpty) {
      return [];
    }
    List<List<Map<int, int>>> results = [];
    for (var i = 0; i < data.length; i++) {
      var item = data[i];
      if (item is Map) {
        List<Map<int, int>> rowList = [];
        var j = 0;
        for (var key in item.keys) {
          var temp = item[key] is String ? item[key] : item[key].toString();
          if (temp.contains(searchStr)) {
            Map<int, int> row = {};
            row[i] = j;
            rowList.add(row);
          }
          j++;
        }
        if (rowList.isNotEmpty) {
          results.add(rowList);
        }
      }
    }
    return results;
  }
}

3.定义一个Message

class MessagePackage {
  SendPort sender; // 临时发送器
  dynamic msg; // 消息
  MessagePackage(this.sender, this.msg);
}

4.开启isolate处理

isolateSearch(String searchStr, List allData) async {
    results.clear();
    if (searchStr.isEmpty) {
      return;
    }
    var data = {"keys": searchStr, "data": allData};
    ReceivePort _temp = ReceivePort();
    //新Isolate的sendPort发送消息给listen监听
    childSender!.send(MessagePackage(_temp.sendPort, data));
    //监听里处理完后返回数据到_temp
    await _temp.first.then((value) {
      results = value;
    });
    _temp.close();
  }

相关推荐

  1. flutter实践Isolate应用实例

    2023-12-30 10:02:01       56 阅读
  2. flutter实践:慎用Expanded()

    2023-12-30 10:02:01       45 阅读
  3. 实时交互新篇章:WebSocket在Flutter中的应用实践

    2023-12-30 10:02:01       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-30 10:02:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-30 10:02:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-30 10:02:01       82 阅读
  4. Python语言-面向对象

    2023-12-30 10:02:01       91 阅读

热门阅读

  1. 不同开源协议之间的差异分析

    2023-12-30 10:02:01       48 阅读
  2. go语言orm框架go-pg如何修改单列/多列、原地运算

    2023-12-30 10:02:01       51 阅读
  3. Spring Boot中关闭Job任务

    2023-12-30 10:02:01       56 阅读
  4. Spring + SpringMVC + SpringBoot

    2023-12-30 10:02:01       54 阅读
  5. TransRPPG

    TransRPPG

    2023-12-30 10:02:01      42 阅读
  6. 解决-bash: /usr/bin/mv: Argument list too long

    2023-12-30 10:02:01       56 阅读
  7. Python 中的异常处理

    2023-12-30 10:02:01       70 阅读
  8. 【Go语言入门:Go语言的方法,函数,接口】

    2023-12-30 10:02:01       57 阅读
  9. 【C++ 单例模式】

    2023-12-30 10:02:01       64 阅读