Flutter 学习与性能优化总结

30天学会Flutter-24:Flutter中的调试技巧 Flutter调试与日志分析工具指南 本文介绍了Flutter开发中的调试工具和日志分析方法。主要内容包括: DevTools调试套件 提供UI检查、性能分析、代码调试、网络监控等功能 可通过IDE或命令行启动 包含检查器、性能分析、调试器等核心模块 日志输出方法 使用print()简单输出 利用dart:developer的log()增强功能 推荐第三方库如logger实现高级日志管理 性能优化建议 识别UI卡顿、内存泄漏等瓶颈 减少重建、优化列表、图片处理等优化策略 文章还提供日志分析技巧和性能优化方法 阅读详情

作者:小肥羊冲冲冲Android

前言

有幸负责的模块使用Flutter编写,在三个月的开发过程中,在原有Demo自学基础上又学到了很多,谨以此篇文章做一个Flutter阶段性的学习和总结,以便于往后的学习过程中温故而知新,那么我们正篇开始。

前世今生

新事物的诞生往往是有一定原因存在的,移动端在这条路上有几个阶段,从Android Native 到 WebView 阶段,为了获得不发版本就可以获得实时动态化的效果,双端使用JSBridge实现了与原生Native底层能力的对接。   Native容器阶段,主要有React Native为代表,虽然RN依赖于原生渲染,性能好与H5,但是还存在一些问题,比如:JavaScript和原生通信,部分场景存在通讯瓶颈,容易导致卡顿、不同移动平台,空间需要单独维护,原生版本更新后,社区控件更新较慢等问题。

Flutter阶段,Flutter抛弃了原生系统控件和 Webview,使用自研高性能渲染引擎来绘制Widget,预先(AOT)编译,运行时直接执行Native(arm)代码,Dart代码执行(在UI TaskRunner),图片下载(IO TaskRunner),真正的渲染(GPU TaskRunner),同平台的通信等(Platform TaskRunner即Native概念下的主线程)是互相隔离的。针对布局等的优化:布局计算时单次树走动即可完成;Relayout Boundary机制:如果Child 的size是固定的,那么不会因为Child的Relayout导致Parent ReLayout等布局优化,都让Flutter脱颖而出。

所以,App引入Flutter,可以有效提高开发效率,避免双端不一致的现象,缩小开发成本。但是Flutter毕竟不是原生,在代码写法上有很多需要注意的地方,文章第三章会主要总结本人在开发和工作中遇到的问题,相比于H5,flutter在动态化方面,支持的并不好。

1 基础知识

1.1 运行模式

Debug:Debug模式可以在真机和模拟器上同时运行:会进入所有断点,包括debugging信息、debugger aids(比如observatory)和服务扩展。优化了快速develop/run循环,但是没有优化执行速度、二进制大小和部署。命令flutter run就是以这种模式运行的。

Release : Release模式只能在真机上运行,不能在模拟器上运行:会关闭所有断言和debugging信息,关闭所有debugger工具。优化了快速启动、快速执行和减小包体积。禁用所有的debugging aids和服务扩展。这个模式是为了部署给最终的用户使用。

Profile:Profile模式只能在真机上运行,不能在模拟器上运行:和Release模式类似,除了启用了服务扩展和tracing,以及一些为了最低限度支持tracing运行的东西(比如可以使用DevTools)。flutter run --profile 可进入该模式。

Test :headless test模式只能在桌面上运行:和Debug模式不同的是headless的而且你能在桌面运行。命令flutter test就是以这种模式运行的。

1.2 架构设计

Framework : 使用dart实现,包括Material Design风格的Widget,Cupertino(针对iOS)风格的Widgets,文本/图片/按钮等基础Widgets,渲染,动画,手势等。

Engine : C++实现,主要包括:Skia,Dart和Text。 Skia是开源的二维图形库,提供了适用于多种软硬件平台的通用API。

Embedder : 嵌入层,即把Flutter嵌入到各个平台上去,这里做的主要工作包括渲染Surface设置,线程设置,以及插件等。 从这里可以看出,Flutter的平台相关层很低,平台(如iOS)只是提供一个画布,剩余的所有渲染相关的逻辑都在Flutter内部,这就使得它具有了很好的跨端一致性。

1.3 渲染流程

Widget:Widget树实际上是一个配置树,而真正的UI渲染树是由Element构成;不过,由于Element是通过Widget生成,所以它们之间有对应关系,我们可以宽泛地认为Widget树就是指UI控件树或UI渲染树。

Element : 一个Widget对象可以对应多个Element对象。这很好理解,根据同一份配置(Widget),可以创建多个实例(Element)。

从创建到渲染的大体流程是:根据Widget生成Element,然后创建相应的RenderObject并关联到Element.renderObject属性上,最后再通过RenderObject来完成布局排列和绘制。

举个栗子?

以下例子取自 闲鱼技术博客 闲鱼Flutter复杂业务优化

Container(
    color: Colors.blue,
    child: Row(
        children: [
    Image.asset('image'),
    Text('text'),
    ],
  ),
);

依据上图 来说就是 UI 刷新的时候,Framework 通知 Engine,Engine 会等到下个 Vsync 信号到达的时候,会通知 Framework 进行 animate, build,layout,paint,最后生成 layer 提交给 Engine。Engine 会把 layer 进行组合,生成纹理,最后通过 Open Gl 接口提交数据给 GPU, GPU 经过处理后在显示器上面显示

在基础能力和业务开发完成后,性能优化和代码检查也是非常重要的,所以后边的文章主要围绕 性能检测和优化 等细节的总结。

3 性能检测工具

结合 Flutter 性能分析 链接 和Flutter 性能视图 等官方文档,整合调试工具说明,并添加自我理解

3.1 Performance Overlay

开启方式比较多,通过 DevTools TimeLines 或者 run Flutter Inspector 都可以进入

点击show CPU GPU 图后

● 竖轴表示耗时,沿竖轴的黑线是时间线 (间隔单位为 16ms) ● 横轴则表示帧,垂直的绿色条代表的是当前帧 (如果为红色则代表处理耗时点) ● 上图显示GPU线程消耗的时间 (帧为红色:Widget太多 场景复杂 渲染耗时) ● 下图显示UI线程消耗的时间 (帧为红色:Dart代码有问题 查看build中是否做太多耗时操作)

也可以在代码中开启 PerformanceOverlay 控件

@override
  Widget build(BuildContext context) {
    Widget app = MaterialApp(
    	// true 展示PerformanceOverlay
      showPerformanceOverlay: showPerformanceOverlay,
      title: 'appname',
      theme: ThemeData(
        appBarTheme: AppBarTheme(brightness: Brightness.light),
        textTheme: textTheme
      ),
      home: _buildHome(context),
      builder: (_, widget) {
        return MediaQuery(
          data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
          child: widget
        );
      },
    );

    return WillPopScope(
      child: app,
      onWillPop: dealWillPop,
    );
  }

showPerformanceOverlay 为MaterialApp自带属性,如果没有使用MaterialApp,可以在代码中通过PerformanceOverlay.allEnabled(checkerboardOffscreenLayers: true); 开启

3.2 DevTools TimeLine

使用 DevTools 可以在Performance Overlay大粒度卡顿范围内深度挖掘 由于Observatory和DevTools功能类似,且正逐渐被DevTools替代,这里主要罗列DevTools的使用方式。

● 顶部部分列表类似于PerformanceOverlay ,深色代表GPU耗时,浅红色代表UI层耗时(图层过多) ● 中间部分为帧事件图表,分位 UI 和 GPU两部分组成 ● 底部部分为CPU图表,主要有三种不同呈现方式来展示CPU调用堆栈信息

我们也可以通过添加一些系统api ,更方便我们定位事件图表具体执行位置 ● debugProfileBuildsEnabled - 向 Timeline 事件中添加 build 信息 ● debugProfilePaintsEnabled - 向 timeline 事件中添加 paint 信息 ● debugPrintRebuildDirtyWidgets - 记录每帧重建的 widget

和Android Profiler 类似,帧事件横轴代表事件顺序,纵轴 代表方法调用堆栈,我们可以通过事件宽度来判断那些事件是比较耗时的。

3.3 Widget rebuild stats

Android Studio 中 View > Tool Windows > Flutter Performance 打开性能工具窗口,在 Widget rebuild stats 中勾选 Track widget rebuilds 来查看 widget 的重建信息。重建信息包括 Widget 名字、源码位置、上一帧中重建次数、当前页面中重建次数。此外,Widget 名字前面还会显示一个小图标。 ● 黄色旋转圆圈 - 重建次数过多 ● 灰色圆圈 - 未重建 ● 灰色旋转圆圈 其他情况

4 性能优化

上一章,对于检测工具大概的总结了使用方式和看法,下边我们就根据工具,来定位界面的问题,并总结出我的优化方式。

4.1 列表优化

在商品2.0中列表占比是比较多得,首页列表的交互逻辑更为复杂,如何让用户用起来如丝般顺滑,需要进行一些性能的打磨。

问题: 界面滑动的时候 会有轻微掉帧现象,检测 fps长期飘红(小于 60fps)

(图一 Flutter Performance 截图)

(图二 DevTools Fps ui GPU 截图)

方案:

更换PowerScrollView 后列表 滑动FPS和部分DevTools截图 PowerScrollView :概念链接

PowerScrollView 优化点:

  1. 针对PowerDataManager 数据可以做到增量更新。
  2. 添加缓存数组,监控_childElements方法来对element 进行缓存,当滚动超出 viewport 的显示以及预加载范围或者数据源发生变化,会通过调用 collectGarbage 方法回收不需要的 elements)
  3. cell 层面引入了 placeholder 的机制,快速滑动场景优化build工作量
  4. 更多样的瀑布流 、列表样式可供选择等等优化

引入后效果,

(图一 Flutter performance 截图)

图中红色部分主要处于手指第一次按下,并且执行了顶部商品工具栏动画的原因

(图二 DevTools FPS UI GPU 截图)

上图可以看到 gpu占比较多,列表滑动起始部分还是有卡顿部分,主要是由于首页商品工具栏过度动画 和 首页复杂的UI展示引起的,后续可以通过

4.2 优化 ClipPath 和 ClipRPath

在刚开始调试初期,使用 Timeline 查看渲染线程性能消耗,可以发现有多个 ClipRectLayer 和 ClipRRectLayer过程,对比商品首页界面后,猜测是在Flutter壳工程中使用自带Image展示图片的时候,对于大图没有进行裁剪显示,部分圆角Widget也需要优化,同时修复 radius 为0也会设置 ClipRRect 的问题。

4.3 常用优化方法

  1. 尽量将setState放在叶子节点,好处是build时影响范围极小,局部刷新
  2. 使用ListView.builder()而不是直接使用ListView()来构建列表 (官方推荐)
  3. 对于频繁更新的控件,使用RepaintBoundary隔离,让其拥有一个独立的paint区域
  4. 使用const来修饰永远不需要变更的控件,如果宽高固定,推荐固定宽高,避免重复计算
  5. 按需使用StateLessWidget,并非全部用StateFulWidget
  6. 使用Visibility控件,避免布局树频繁切换
  7. 针对于使用Fish-redux,state 对象中的视图数据真正发生变化的时候,新建 state 对象
  8. 使用图片替换半透明效果,减少saveLayer 或者clipPath 的使用。

最后

不知不觉已经写到了最后,对于Flutter的学习和使用,一直都在路上,文章中不免有些纰漏,还望大佬们海涵并指出,后续会继续深耕Flutter 动态化方案和Flutter性能优化,继续努力学习,继续满血冲冲冲!

Flutter 工具DevTools使用-译文 当然,还有flutter工具,它可以在调试模式下运行你的应用程序,执行热重载,构建APK和IPA等等。flutter工具是用Dart编写的,在命令行上运行,所以无论你喜欢哪种操作系统或编辑器,都可以使用Flutter。Dart分析服务器在各种IDE中提供静态分析和智能。这意味着你可以得到代码补全…这恰好是VS Code,但这里所有的例子在Android Studio中也能使用,当然。… 错误高亮显示并链接到的文档… 阅读详情

相关推荐

【window10】Dart+Android Studio+Flutter安装及运行

Dart是一种简洁、清晰、基于类的面向对象的语言,具有专门为客户端优化、高生产力、快速高效、可移植(兼容ARM/x86)、易学的OO编程风格和原生支持响应式编程(Stream & Future)等优秀特性。 Android Studio是Android开发不可或缺的一个开发工具。 Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。

aDiaoYa_的博客 6247

Flutter 的可视化界面、绘制性能调优 —— DevTools

关注前端瓶子君,回复“交流”加入我们一起学习,天天进步授权转载自:多肉葡萄五分糖https://juejin.cn/post/6897101906158714887前言给大家介绍De...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 9876

Flutter学习资料集合(开发必备)

Flutter学习资料,包含了Flutter学习社区、入门学习资料、进阶学习资料、性能优化、面试资料和书籍等资料

henhenha的博客 4054

Flutter 工具DevTools使用-译文,字节Android高工面试

感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。

2401_83539973的博客 1998

2024年Flutter从入门到精通全网最全学习路线指南

我也面试过一些Flutter求职者,我一般从这几个方面提问,dart代码编写的设计思想与规范、dart异步模型与Flutter引擎原理、Flutter性能优化、Flutter状态管理与组件化开发、Flutter与原生结合部分的知识,譬如插件、原生通信、安卓基本常识、iOS基本常识。如果你想做Flutter,你可以从这几个方面好好的了解了解。布局原理与实践:通过学习Container、Row、Column、Stack、Flex等布局组件,掌握Flutter的响应式布局原理,并进行实际操作演练。

flutter开发app的博客 1742

Ansys Lumerical | 薄膜铌酸锂电光调制器的仿真与优化

本文详细介绍了使用Ansys Lumerical进行薄膜铌酸锂电光调制器仿真与优化的全流程。从基础原理到电学仿真、光学模拟技巧,再到设计优化实战经验,帮助工程师掌握这一先进光电器件的仿真方法。重点解析了薄膜铌酸锂的Pockels效应和Mach-Zehnder结构设计,并提供了常见问题排查指南和最新发展动态。

vulkan6gpu的博客 1200

鸿蒙跨端框架Flutter学习:性能优化

Platform Channel通信涉及跨平台数据序列化,合理优化可以显著提升性能。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;Platform Channel调用数据序列化跨平台传输数据反序列化执行操作结果返回|| 优化点 | 说明 | 效果 || 减少调用次数 | 批量处理数据 | 显著提升 |

2402_85760345的博客 702

数字IC后端设计实现之Innovus POD V2 Flow性能优化全解析

本文深入解析了数字IC后端设计中的Innovus POD V2 Flow性能优化方案。该流程通过整合place_opt_design与clock_opt_design命令,实现了布局与时钟树的协同优化,有效提升了时序收敛效率、改善了设计密度与拥塞,并显著减少了迭代次数,是应对先进工艺复杂设计的关键利器。

ik6789012的博客 1256

Flutter开发者必备学习资料

Flutter学习资料,包含了Flutter学习社区、入门学习资料、进阶学习资料、性能优化、面试资料和书籍等资料

the_cleaner的博客 1301

PaddleOCR SVTRv2中文识别模型训练全流程:从数据准备到推理部署

本文详细介绍了基于PaddleOCR的SVTRv2中文识别模型从数据准备、模型训练到推理部署的全流程实战。SVTRv2凭借其单视觉Transformer架构和分层混合机制,在中文文字识别任务上实现了高精度与效率的平衡。文章重点解析了数据工程、训练调优技巧及部署优化方案,帮助开发者构建定制化的OCR解决方案。

weixin_29194817的博客 287

虚幻UE 增强输入-触发器

输入触发器(UInputTrigger): 使用经过修饰器修改的输入值,或者使用其他输入动作的输出值,来确定是否激活输入动作。

UE成长之路,欢迎大家的关注! 5465

学习Flutter跨平台移动应用开发与性能优化技巧

而有状态组件管理着随时间变化的数据,开发者需精确控制其状态更新范围,通过`setState`方法触发最小化的UI重建,避免不必要的性能开销。对于复杂绘制,可考虑使用`CustomPaint`进行自定义,但需注意在`paint`方法中避免创建新画笔(`Paint`)或路径(`Path`)对象,应在初始化阶段创建并复用。例如,使用`Selector`(在Provider中)或`Consumer`的特定部分,可以确保只有当其依赖的状态数据真正改变时,相关的Widget才会重建,从而有效遏制重建“洪水”。

osbxbv_471的博客 213

Android软键盘系统深度解析:架构、原理与实现

Android软键盘系统深度解析:架构与实现原理 本文系统剖析了Android软键盘的核心工作机制。作为系统级输入服务,软键盘具有双重属性:既是可安装的独立应用,又深度集成于系统框架中。文章详细解读了软键盘的系统架构,包括其与InputMethodManagerService(IMMS)和WindowManagerService(WMS)的交互机制,以及通过InputConnection实现的跨进程通信流程。同时分析了输入法窗口的特殊管理策略、布局调整模式,并深入探讨了输入预测引擎的实现原理,包括词典加载、

保持专注,保持热爱 116

Flutter学习——开发Flutter需要的技能

上一章,介绍了Flutter的来源和平台支持及特点,这一章,来梳理一下学习Flutter所需掌握的一些知识内容,希望我这浅陋的分享,能给你带来那么一丢丢的帮助这章的内容,比较枯燥,也是博主对Flutter浅薄认识中的一部分,分享的过程,也是自己掌握的过程,加深印象,更加清楚以后学习的目标,爱分享,爱学习,爱编程的小猿,继续加油啦 哈哈。

zww986736788的博客 983

软考 系统架构设计师历年真题集萃(248)

软考 系统架构设计师历年真题集萃(248)

phmatthaus的专栏 793

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

Flutter零基础入门学习资料集合

Flutter学习资料,包含了Flutter学习社区、入门学习资料、进阶学习资料、性能优化、面试资料和书籍等资料

m0_67537062的博客 1481

RV1126 ISP调参实战:3A算法参数调节的7个技巧

││ │ DEMOSAIC (去马赛克) │ ││ │ GAMMA (Gamma 校正) │ ││ │ DPC (坏点校正) │ ││。

小灰灰的博客 668

2024年Flutter开发全网最全学习路线指南

随着移动开发技术的快速发展,Flutter作为Google推出的跨平台开发框架,以其高效的热重载、统一的UI开发体验和卓越的性能表现,正逐渐成为众多开发者青睐的首选工具。为了帮助广大编程爱好者及职业开发者在2024年更好地掌握Flutter技术,本文将为您呈现一套全面且深度的Flutter学习路线图。10.1 自定义组件方法简介10.2 组合现有组件10.3 组合实例:TurnBox10.4 CustomPaint 与 Canvas10.5 自绘实例:圆形背景渐变进度条。

xiaokangss的博客 4740

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Flutter学习笔记&学习资料推荐,BATJ等企业Android面试知识分享

对程序员来说,很多技术的学习都是“防御性”的。也就是说,我们是在为未来学习。我们学习新技术的目的,或是为了在新项目中应用,或仅仅是为了将来的面试。但不管怎样,一定不能“止步不前”,不能荒废掉。!文章以下内容会给出阿里与美团的面试题(答案+解析)、面试题库、Java核心知识点梳理等轻大家的负担。**[外链图片转存中…(img-fO4dCtcL-1711747815921)][外链图片转存中…(img-Z1zsqlG0-1711747815922)]

2401_84006828的博客 1164

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

flutter已有的丰富学习资料(2021)

flutter已有的丰富学习资料(2020) 记录比较丰富的学习资料 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录flutter已有的丰富学习资料(2020)一、基础技术入门资料三、资料1.2020年谷歌大会(flutter)2.阿里开源flutter资料四、性能1、内存最后 一、基础技术入门资料 flutter 的中国社区:https://flutterchina.club/ flutter 实战资料:https://book.flutterchina.club/

m0_53337932的博客 681

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Flutter性能优化实践_customscrollview 提前渲染(2),程序员去大公司面试问题

Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的,可以用一套代码同时构建Android和iOS应用,性能可以达到原生应用一样的性能。但是,在较为复杂的 App 中,使用 Flutter 开发也很难避免产生各种各样的性能问题。在这篇文章中,我将介绍一些 Flutter 性能优化方面的应用实践。另外Flutter动态化框架已开源:

2401_84160361的博客 1107

Flutter正在被悄悄放弃?浅析Flutter的未来

不论是什么时代的开发技术,解决的问题无非就是性能,开发效率以及热更新。而这前两者Flutter已经接近完美解决了,至于热更新相信随着后面不断的更新迭代,会有越来越优秀的解决方案。

m0_64420071的博客 1万+

【全套】Android架构师进阶学习教程(性能优化、Kotlin、Flutter、微信小程序...)

想要成为一名优秀的 Android 开发,你需要建立一份完备的知识体系,让我们学到的知识体系化,并且清楚哪块是自己的知识盲区,再根据实际情况有针对性的进行模块学习。从初级到中级开发不难,但要迈入高级工程师甚至架构师的层次,就不只是工作经验的积累所能达到的了。个人建议,有一定开发经验和基础的Android程序员,可以将学习的重点放在以下这七个部分:架构师筑基必备技能设计思想解读开源框架360°全方位性能调优Android框架体系架构NDK模块开发(音视频系列)Flutter技术学习。

datian1234的博客 513

Flutter社区与支持:Awesome Flutter中的开发者资源与学习路径指南

想要快速掌握Flutter开发吗?Awesome Flutter为你提供了完整的开发者资源与学习路径指南!这个精心整理的资源库汇集了Flutter社区中最优秀的库、工具、教程和文章,是每个Flutter开发者必备的宝藏清单。无论你是刚入门的新手还是经验丰富的开发者,这里都能找到提升技能所需的一切资源。 ## 为什么选择Awesome Flutter作为你的学习起点? Awesome Flutt

gitblog_01159的博客 365
上一篇: 2021年为什么这么多人劝退Android开发,学习正确姿势是什么?
下一篇: Android 高工对自己过往面试的汇总总结~
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值