【Flutter】多线程

这篇具有很好参考价值的文章主要介绍了【Flutter】多线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Flutter 作为一个跨平台的UI库,前面的Flutter 架构有涉及到,Flutter 架构中的运行的多个线程。那么最为一个Flutter开发者,我们如何创建线程呢

多线程

上述我们提及到了,架构层涉及的多线程问题。比如说 主线程, 平台线程GPU线程。本文讨论的及主线程,dart 运行在虚拟中的多线程问题。OK,言归正传。

线程模型

作为一个iOSer,我们在移动端开发的时候,会有多线程的应用场景。关于iOS中多线程我们会遇到线程同步的问题。比如说资源竞争,数据同步我们会引用到, 关于自旋互斥的面试问题也是考察比较多的。呢么flutter 的线程模型是啥呢。这里我们引入isolate

Isolate

flutter的线程是一个独立的Isolate, 每个Isolate 管理其属于自己的EventLoop (此处的设计思路和iOS中线程与RunLoop的关系是一样的)和JS的事件循环蕾丝,关于EventLoop事件循环后续会出文章解释,此处不提及。需要注意的是async 在没有创建新的Isolate时,还是会将事件推入主Isolate 的任务队列当中的。

Talk is cheap

言归正传,了解了flutter 中的线程模型。那我们如何创建新的Isolate。举个🌰,我们需要从文件中读取配置。在处理I/O费时操作的时候,我们一般会创建一个新的Isolate

dart Isolate 🌰
import 'dart:convert';
import 'dart:io';
import 'dart:isolate';

void main(List<String> args) async {
  print("${Isolate.current.debugName}");
  final jsonData = await Isolate.run(_readAndParseJson);
}

Future<Map<String, dynamic>> _readAndParseJson() async {
  final configuration = await File("configuration.json").readAsString();
  final jsonData = jsonDecode(configuration) as Map<String, dynamic>;
  print("${Isolate.current.debugName}");
  return jsonData;
}

输出结果如下

main
_RemoteRunner._remoteExecute

Exited.
flutter🌰
import 'dart:convert';
import 'dart:io';
import 'dart:isolate';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatefulWidget {
  const MainApp({super.key});

  
  State<MainApp> createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  String content = "内容占位符";

  void _updateContent() async {
    // Map<String, dynamic> configuration = await _readAndParseJson();
    print("${Isolate.current.debugName}");
    Map<String, dynamic> configuration = await _readAndParseJson();
    final name = configuration["name"];
    setState(() {
      content = name;
    });
  }

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text("jeverson's eg"),
        ),
        body: Center(
            child: Text(
          content,
          style: const TextStyle(color: Colors.black),
        )),
        floatingActionButton: FloatingActionButton(
          onPressed: _updateContent,
          child: const Icon(Icons.update),
        ),
      ),
    );
  }
}

Future<Map<String, dynamic>> _readAndParseJson() async {
  final configuration = await rootBundle.loadString("lib/configuration.json");
  return compute((message) {
    print("${Isolate.current.debugName}");
    return jsonDecode(configuration) as Map<String, dynamic>;
  }, configuration);
}

ByTheWay

演示代码中我们使用的是dart,使用的是run, 在flutter 中我们使用compute 函数。文章来源地址https://www.toymoban.com/news/detail-797634.html

TODOIsolate间通信

到了这里,关于【Flutter】多线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter30(2),java线程面试题

    ); } //条目跳转 _navPush(BuildContext context, Widget page) { //路由跳转 Navigator.push(context, MaterialPageRoute(builder: (context) = page)); } } navigation_icon_view.dart底部导航栏的对象,包含title以及icon的路径,使用构造函数来实现 import ‘package:flutter/material.dart’; /// 自定义底部导航栏的四个View class

    2024年03月28日
    浏览(25)
  • Flutter 单线程模型保证UI运行流畅

    Flutter 框架出色的渲染和交互能力。支撑起这些复杂的能力背后,实际上是基于单线程模型的 Dart。那么,与原生 Android 和 iOS 的多线程机制相比,单线程的 Dart 如何从语言设计层面和代码运行机制上保证 Flutter UI 的流畅性呢? 因此今天,我会通过几个小例子,循序渐进地向你

    2024年02月16日
    浏览(29)
  • 【Flutter】Flutter 如何使用 flutter_swiper

    在移动应用开发中,轮播图是一种常见的 UI 元素,它可以用来展示一系列的图片或者内容。在 Flutter 中,我们可以使用 flutter_swiper 这个库来创建轮播图。那么在 Flutter 这个强大的移动应用开发框架中,我们如何使用 flutter_swiper 呢? 如果你想深入学习 Flutter,掌握更多的技巧

    2024年02月09日
    浏览(37)
  • Flutter学习四:Flutter开发基础(六)调试Flutter应用

    目录 0 引言 1 调试Flutter应用 1.1 日志与断点 1.1.1 debugger() 声明 1.1.2 print和debugPrint 1.1.3 调试模式、中间模式、发布模式 1.1.4 断点 1.2 调试应用程序层 1.2.1 转储Widgets树 1.2.2  转储渲染树 1.2.3 转储Layer树 1.2.4 转储语义树 1.2.5 调度(打印帧的开始和结束) 1.2.6 可视化调试

    2024年02月12日
    浏览(44)
  • Flutter 笔记 | Flutter 动画

    为了方便开发者创建动画,不同的UI系统对动画都进行了一些抽象, Flutter中也对动画进行了抽象,主要涉及 Animation、Curve、Controller、Tween 这四个角色,它们一起配合来完成一个完整动画,下面我们一一来介绍它们。 1. Animation Animation 是一个抽象类,它本身和UI渲染没有任何关

    2024年02月07日
    浏览(33)
  • 【Flutter】Flutter简介

    Flutter是Google开发的一款用于构建高性能、高保真移动应用程序的开源UI工具包。它允许开发人员使用Dart语言来构建跨平台的移动应用程序,并提供了丰富的UI组件、动画效果和手势识别等功能。 以下是Flutter入门的一些详细介绍: Flutter概述 Flutter是一个基于Dart语言的跨平台移

    2024年02月10日
    浏览(31)
  • flutter flutter pub cache clean和flutter clean区别

    flutter pub cache clean 和 flutter clean 是 Flutter 开发中两个不同的命令,它们的作用和使用场景有所不同。 flutter pub cache clean :这个命令用于清理 Flutter 的包缓存。在使用 Flutter 进行开发时,会下载和缓存一些第三方依赖包,这些包会被保存在 Flutter 的包缓存中。 flutter pub cache c

    2024年02月03日
    浏览(34)
  • Flutter系列文章-Flutter基础

    Flutter是Google推出的一种新的移动应用开发框架,允许开发者使用一套代码库同时开发Android和iOS应用。它的设计理念、框架结构、以及对Widget的使用,都让开发者能更有效率地创建高质量的应用。 Flutter的设计理念是“一切皆为Widget”。这意味着不论是按钮、字体、颜色、布局

    2024年02月16日
    浏览(34)
  • 【Flutter -- 基础】快速入门 Flutter

    一、Flutter 介绍 Flutter app 使用了 Dart 语言,源自于 Google,现在是 ECMA 的标准。Dart 吸收了许多现代语言的特性,比如 Kotlin 和 Swift,同时能被转译成 js 代码。 作为一个跨平台框架,Flutter 和 React Native 非常像,因为 Flutter 支持响应式和声明式语法。但和 React Native 不同,Flutt

    2024年02月02日
    浏览(30)
  • Flutter 笔记 | Flutter 布局组件

    布局类组件都会包含一个或多个子组件,布局类组件都是直接或间接继承 SingleChildRenderObjectWidget 和 MultiChildRenderObjectWidget 的Widget,它们一般都会有一个 child 或 children 属性用于接收子 Widget。 不同的布局类组件对子组件排列(layout)方式不同,如下表所示: Widget 说明 用途

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包