自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程之路的专栏

个人公众号:编程之路从0到1

  • 博客(162)
  • 资源 (9)
  • 收藏
  • 关注

原创 Flutter为什么不需要子线程——Dart IO源码剖析(下)

在中,我们详细剖析了Dart 的文件IO,这一章,我们将剖析Dart 网络IO。

2024-01-18 15:28:14 918

原创 Flutter为什么不需要子线程——Dart IO源码剖析(上)

许多Flutter新手,特别是安卓、iOS原生开发转做Flutter的小伙伴,一直对Flutter 单线程模型开发APP倍感不解,他们总是喜欢本能的把网络请求、文件读写放到一个单独线程去做,因为“耗时操作会阻塞UI线程嘛”。于是,我看到有人把这些所谓耗时代码放到一个单独的Isolate中去做,美其名曰优化性能,提升帧率,殊不知这是耗费资源,降低性能。因为Isolate是内存隔离的,它比操作系统线程要更重,与其说它是Dart的线程,不如说它更像进程。

2024-01-18 15:08:31 947

原创 Dart VM的线程池剖析

关注公众号:编程之路从0到1。

2024-01-18 14:15:20 836

原创 Flutter 网络请求库之Gio

在Flutter开发中,常用网络请求库有dio和http两个,但它们有时候并不能完全满足我们的需求,因此我开发了这个网络请求库。首先,我为什么不直接fork已有的库添加新的功能,而要自己从头开发一个这样的库呢?一方面我觉得目前最热门的dio的代码写得并不直观,并不适合添加我设想的新特性,另一方面,别人的项目自己也无法掌控走向,索性自己撸一个。是一个功能强大的Dart HTTP请求库,它提供链式调用拦截器,通过它我们可以实现许多功能。

2023-04-12 22:02:05 324 1

原创 开发一个APP多少钱?

开发一个APP要多少钱?相信不光是客户有这个疑问,就算是一般的程序员也想知道答案。很多程序员想在业余时间接外包挣外快,但是他们常常不知道该如何定价,如何有说服力的要价。这是因为没有一套好的计算APP开发成本的方法。由于国内没有公开的数据,而且大家对于报价都喜欢藏着掖着,这里我们就整理了国外一些软件外包平台的资料,帮助大家对Flutter APP开发成本有一个直观而立体的认识。(注意,这里是以美元单位计算,请不要直接转换为RMB,应当根据消费力水平来衡量)跨平台项目正在慢慢取代原生应用程序的开发。

2022-11-26 11:55:22 826

原创 Flutter 的键值存储数据库

键值存储是开发中十分常见的需求,在Flutter开发中,一般使用 shared_preferences 插件来实现。shared_preferences 本质上就是将键值对保存到一个XML文件中进行持久化。而shared_preferences 实际上存在一定缺陷,譬如其性能较差,不适合处理大量数据,不能创建新的XML文件,所有数据存在同一个文件中。除此外,还有其他一些持久化方案,如SQLite、Hive等。SQLite是关系型数据库,使用起来相对繁琐;.........

2022-08-08 00:02:44 532

原创 为什么是 Dart ?

为什么是 Dart ?为什么选择Dart语言,这是很多人的疑问,让我们先来看看,最近Dart 编程语言的发展情况:2022年2月TIOBE编程语言排行榜:很遗憾,Dart在前20名之外,但好消息是它还处于前30名之内!在这个排行榜中,值得我们注意的是Dart语言仍然处于Kotlin之上,虽然优势并不明显。让我们再来看一看 IEEE Spectrum 最新发布的2021年度的编程语言排行榜 Top Programming Languages 2021在IEEE Spectrum 的榜单中,Dar

2022-02-15 21:41:06 2259

原创 代码该怎么写——设计原则

代码该怎么写——设计原则初学者学会编程语言后开始写代码,当我们实现一个功能后会有成就感,但是看了别人写的代码又大感困惑,他为什么把代码写得那么复杂?明明一个简单的功能,为什么要这样做?还有人即使学会了编程语言,仍然不知道怎么下手写代码,哪里该创建一个类,哪里又该创建一个方法?现代社会,文盲率很低,人人识字,但为什么不是人人都能当作家呢?因为,我们只学识字是不够的,我们还得学习写作的技巧和套路,并且还要有一定的人生经历,这样才能成长为一个作家。简而言之,会写代码,和写好代码,是两个层面!面向对象编程

2022-02-15 21:39:55 3730

翻译 公布Windows版Flutter

公布Windows版Flutter构建高质量的Windows应用程序,并在移动和web上运行自从我们推出Flutter以来,我们一直专注于提供一个跨平台的解决方案,以获得漂亮的、定制的应用程序,这些应用程序被编译为机器代码,并充分利用您的设备的底层图形硬件。今天是这一愿景的重大扩展,我们首次发布了对Windows作为应用目标的支持,使Windows开发者能够受益于移动开发者所享有的同样的生产力和力量。我们在Flutter上的目标是为您提供构建良好体验所需的工具,无论您在哪个操作系统上构建。因此,我们

2022-02-04 14:34:00 639

原创 Flutter 超简单状态管理

Flutter 状态管理目前Flutter已经有许多状态管理的方案,但就我个人而言,并不能完全满足我的要求。我希望状态管理更加简单,而不是成为负担,我希望状态管理更加可靠,而不是使用过于复杂的实现。譬如目前最为简洁的get库,为了实现一些黑科技语法糖,其实现就较为复杂。我们知道一台机器越复杂,可靠性就会降低。道理就如同在一些动乱地区,非常流行一些傻大黑粗的皮卡车,结构简单,皮实耐用。为了兼具简洁和可靠性,同时摆脱对InheritedWidget的限制,我使用注解和依赖注入库来实现,原理上类似Bloc,但

2021-12-03 22:46:03 3228

原创 Dart 全栈之服务端

Dart 的服务端开发本文是博主《Flutter全栈式开发》系列课程的拓展。我们在Flutter课程中,编写了一个注册登录案例,详细讲解了常见的注册、登录、API接口鉴权功能,前后端是如何配合实现的。其中后台服务使用了Dart语言中较为知名的aqueduct框架。近来由于Dart版本迭代过于频繁和激烈,尤其是不兼容的空安全特性,导致课程中使用的服务端框架aqueduct停止维护。维护该框架的公司没有多余的精力使之兼容新版本,目前亦无社区接手项目,可能永久停止。相继的,Dart的第二大服务端框架angel

2021-10-18 14:48:39 1681 1

原创 全网最简单的Flutter Navigator2.0路由指南

准备关于Flutter路由的一些原理,可以阅读我们之前的文章《Flutter 路由源码剖析》,本文我们主要来学习一下Navigator2.0的用法。为了演示Navigator2.0的用法,这里准备了一个简单案例,项目下载 访问这里。nav_demo目录是一个使用Navigator1.0的示例,总共4个页面,分别是:splash、login、home、details代码结构如下:核心代码:class MyApp extends StatelessWidget { const MyApp({

2021-10-09 22:49:33 2189 1

转载 关于Flutter你应该知道的一切

文章目录关于Flutter你应该知道的一切概述什么是 Flutter?Flutter 是干什么的?哪些人会用到 Flutter?我需要拥有怎样的开发经验才能使用 Flutter?我可以用 Flutter 构建怎样的应用?谁创造了 Flutter?谁在使用 Flutter?Flutter 有哪些独到之处?我需要使用 Flutter 来构建我的下一个应用吗?Flutter 能够为我们提供什么?Flutter SDK 里有什么?用 Flutter 开发时可以使用哪些编辑器或 IDE?Flutter 里存在开发框架

2021-10-07 14:04:59 632

原创 Flutter 升级2.5之后报错?

Q:Flutter执行命令升级新版本后,用flutter doctor命令检查时存在如下问题:按照提示键入命令后,再次出现报错:A:当我们升级SDK后,执行flutter doctor,这里是提示我们需要安装Android开发的命令行工具。当我们依照提示安装命令行工具时,出现的Java报错,一般是因为我们本地自己安装了一套Java版本,但是Java的版本号又高于1.8,出现了兼容性问题。解决问题的方法有两种,第一种是卸载我们自己安装的Java,重新安装一个低版本的Java(1.8),但不推荐!

2021-10-03 09:17:14 570

原创 Flutter 最佳扫码插件——自定义视图

之前封装了Flutter扫码插件后,许多人希望能提供自定义视图的支持,于是将flutter_scankit 升级到v1.2。关于该插件的介绍以及基础用法,请查看上一篇《Flutter 最佳扫码插件》自定义视图使用插件库提供的ScanKitWidget作为扫码控件,建议用Stack布局组合其他控件实现自定义视图。在创建ScanKitWidget时,必须实现其回调函数callback,该回调返回一个ScanKitController,用于调用与扫码相关的功能。 ScanKitWidget(

2021-09-13 10:48:21 2332 6

原创 LuaDardo中Dart与Lua的相互调用

本系列相关文章:Flutter 热更新及动态UI生成Lua 15分钟快速上手(上)Lua 15分钟快速上手(下)Lua与C语言的互相调用Lua C APILua C API主要是指一系列以lua_开头的C语言函数(也可能是宏函数)。Lua的定位是一门强大、高效、轻量级的可嵌入脚本语言。为了很方便地嵌入到其他宿主(Host)环境中,Lua核心是以库(Library)的形式被实现的,其他应用程序只需要链接Lua库就可以使用Lua提供的API轻松获得脚本执行能力。Lua 3.1引入了lua_Sta

2021-08-11 00:10:23 1234

原创 Lua与C语言的互相调用

Lua底层是C语言开发的,在设计时就考虑到了与C语言的互操作性。可以把Lua作为一种独立的语言或者作为一种嵌入式的脚本语言。有许多游戏和其他应用程序利用Lua作为脚本语言。在本文中,我们将重点探讨如何将Lua嵌入到C或C++应用程序中,作为胶水脚本存在。虽然此文只关注C语言的API,但在LuaDardo项目中,这些C API并没有做根本改变,只是在命名规范上做了适应Dart语言的变化(驼峰命名法)。简单说,LuaDardo基本是兼容这些API的。使用 C APILua的C语言API是高效和轻量级的。在

2021-08-09 19:18:47 5288 3

原创 Lua 15分钟快速上手(下)

Lua 15分钟快速上手(上)进阶语法篇迭代器迭代器(iterator)是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中,通常使用函数表示迭代器:每一次调用函数时,函数会返回集合中的“下一个”元素。泛型for迭代器泛型for在自己内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。语法格式如下:for var-list in exp-list do bodyendvar-list是由一个或多个变量名组成的列表,以逗号分隔;exp-list是一个或多个

2021-08-09 13:29:17 750

原创 Lua 15分钟快速上手(上)

在之前的博客《Flutter 热更新及动态UI生成》一文中,通过编写LuaDardo虚拟机,大致介绍了在Dart语言之上开发Lua虚拟机给Flutter提供动态能力的方案,但Lua语言流行并不算广泛,许多人对小巧精湛的Lua语言缺少了解,认为将Lua替换为JavaScript语言更好。为此,我特别整理了两篇Lua语言的快速上手指南,相信充分学习了解后,会认同在特定需求场景下,小巧简洁的Lua将更具“胶水”优势。基础语法篇注释单行注释多行注释-- 单行注释,使用两个减号--[[多行注释

2021-08-08 16:30:01 1857 1

原创 Flutter 热更新及动态UI生成

问题由于Dart语言在Flutter上关闭了反射,且本身依缺乏动态能力,因此在Flutter上实现热更新或动态UI较为困难。目前已有的一些动态方案:利用原生框架更新桥接动态脚本语言修改引擎(动态桥接增强版)XML/JSON配置UI以上方案,在我看来都不可取!原因这就来一一分析。利用原生框架更新,实际上就是更新Flutter框架相关的二进制。Flutter应用发布出来的产物主要包括 libflutter.so,libapp.so,flutterAssets,这样,就可以通过Android端

2021-05-12 03:18:37 2286 3

原创 最简单的Flutter权限管理插件

文章目录用法配置权限AndroidiOS检查权限请求权限处理回调例子这是Flutter上的一个动态权限处理的插件库,可以让Flutter应用层的开发者以非常简单的API统一处理原生的动态权限。它封装了关于权限的检查、请求,以及权限被永久拒绝时,适当的拉起系统设置页面,提示用户手动打开权限。几乎想不到拒绝使用它的理由。仓库地址: flutter_easy_permission Android iOS用法配置权限检查权限。当调用一些需要权限的API时,应先检查是否具有相关权限请求权限。

2021-05-02 23:15:36 1394

原创 Flutter 最佳扫码插件

长期以来,Flutter都缺乏一个简单易用,功能强大的二维码、条形码等扫码库,需要既能支持相机扫码,也能支持本地图片码识别。为了解决这个问题,我考察了原生的扫码生态,选取了功能强大的HUAWEI ScanKit SDK,对它进行了Flutter插件包封装。...

2021-05-02 23:03:31 3454 8

原创 如何修改用Flutter构建的App显示名称?

Q:我已经使用Flutter创建了testapp。现在,我想把应用程序的名字从 "testapp"改为 “My Trips Tracker”。我该怎么做呢?我试过从AndroidManifest.xml中更改,它被更改了,但是有Flutter提供的方法吗?A1:有一个插件叫flutter_launcher_name,可以满足你的要求:修改pubspec.yaml添加依赖,并将你的Flutter App名称配置其中:dev_dependencies: flutter_launcher_nam

2021-04-01 00:49:41 1165

原创 如何在Dart中创建一个单例?

Q:单例模式确保一个类只有一个实例被创建。我如何在Dart中构建这个模式?A:在Dart中构建一个单例很容易,以工厂构造方法为例:class Singleton { static final Singleton _singleton = Singleton._internal(); factory Singleton() { return _singleton; } Singleton._internal();}你可以这样使用它:void main() {

2021-04-01 00:47:40 1557

原创 如何更改Flutter上的应用启动图标?

Q:当我用flutter创建一个应用时,flutter的logo被用作两个平台的应用图标。如果我想改变应用图标,是否要到两个平台目录中去替换那里的图片呢,我说的平台目录是指iOS的myapp/ios/Runner/Assets.xcassets/AppIcon.appiconset和Android的myapp/android/app/src/main/res。或者是否可以将图片定义为Flutter Asset,图标以某种方式生成?A1:Flutter Launcher Icons旨在帮助快速生成A

2021-04-01 00:45:40 1271

原创 如何在Flutter中使用十六进制颜色?

Q:我如何在Flutter中把像"#b74093"这样的十六进制颜色字符串转换为Color ?我想在Dart中使用HEX颜色码。A1:在Flutter中,Color类只接受整数作为参数,也可以使用命名构造函数fromARGB和fromRGBO。因此我们只需要将字符串#b74093转换为一个整数值。另外,不透明度总是需要被指定的。十进制255的不透明度用十六进制值FF表示。这让我们得到了0xFF。现在,我们只需要像这样附加我们的颜色字符串:const color = const Color(

2021-03-30 04:29:32 1123

原创 Android SDK/NDK命令行环境

SDK/NDK 命令行环境命令行环境搭建通常我们会借助Android Studio这个IDE来安装开发环境(SDK、NDK),但是在Linux系统,特别是在自动集成编译的服务器环境下,没有GUI图形桌面时,只能安装一套命令行环境。下面介绍如何通过手敲命令的方式安装Android 编译环境首先我们需要安装一个用于安装、管理Android开发环境的命令行工具:选取某个合适的路径下(可以是当前的用户目录),创建android-sdk文件夹,并进入该文件夹mkdir android-sdkcd an

2021-03-04 16:52:44 321 1

翻译 SDL编程入门(31)滚动背景

滚动背景通常在游戏中,你可能想要一个无限或循环的背景。使用滚动背景,你可以循环一个永远持续下去的背景。比如说,如果我们想在一个无限的背景上围绕一个点移动:我们要做的就是将背景的两次迭代彼此相邻渲染,并将它们每帧移动一点。 当背景完全移开时,你可以重新设置运动://The dot that will move around on the screenclass Dot{ public: //The dimensions of the dot static

2021-01-04 15:41:18 595

翻译 SDL编程入门(30)滚动

滚动到目前为止,我们只涉及屏幕大小的平面。有了滚动功能,你可以通过渲染与摄影机相关的所有内容来浏览任何大小的平面。滚动的基本原理是,你有一个矩形,它的功能是一个摄像机:然后你只渲染摄像机里的东西,通常涉及渲染相对于摄像机的事物或仅显示摄像机内部的对象的一部分。//平面的尺寸const int LEVEL_WIDTH = 1280;const int LEVEL_HEIGHT = 960;//屏幕尺寸常量const int SCREEN_WIDTH = 640;const int SC

2021-01-04 15:36:28 514

翻译 SDL编程入门(29)圆形碰撞检测

圆形碰撞检测除了矩形碰撞框,圆是最常见的碰撞器形式。在这里,我们将检查两个圆以及一个圆和一个框之间的碰撞。检查两个圆之间的碰撞很容易。 你要做的就是检查每个圆心之间的距离是否小于其半径的总和(半径是半径的倍数)。对于框/圆碰撞,必须在碰撞框上找到最接近圆心的点。 如果该点小于圆的半径,则发生碰撞。//一个圆结构体struct Circle{ int x, y; int r;};SDL有一个内置的矩形结构,但我们必须自己制作一个有位置和半径的圆形结构。//The dot t

2020-12-30 02:47:26 760

翻译 SDL编程入门(28)每像素碰撞检测

每像素碰撞检测一旦你知道如何检查两个矩形之间的碰撞,你可以检查任何两个图像之间的碰撞,因为所有的图像都是由矩形构成的。在电子游戏中,所有的东西都可以用矩形来做,甚至这个点:没看到?我们把它放大:还没看到?那现在呢?:图像由正方形的像素组成,正方形的像素为矩形。 要进行每个像素的碰撞检测,我们要做的就是让每个对象都有一组碰撞框,并检查一组碰撞框与另一组碰撞框的碰撞,如下所示://在屏幕上移动的点class Dot{ public: //The dimensions

2020-12-30 02:45:52 724

翻译 SDL编程入门(27)碰撞检测

碰撞检测在游戏中,你经常需要判断两个物体是否相互撞击。对于简单的游戏来说,通常用边界框碰撞检测来完成。碰撞框是检查两个对象之间碰撞的标准方法。当两个多边形没有分开时,它们就会发生碰撞。这里我们有两个没有碰撞的盒子。如你所见,它们的x投影在底部,y投影在左边:在这里,你可以看到这些盒子沿着y轴相撞,但它们在x轴上是分开的:这里的盒子在X轴上是相撞的,但在Y轴上是分开的:当任何一个轴上没有分离时,就会发生碰撞:这种形式的碰撞检测,我们试图找到一个物体分离的轴,称为分离轴测试。如果没有分离轴,那么

2020-12-30 02:44:16 1189

翻译 SDL编程入门(26)运动

运动现在我们知道了如何渲染、处理输入和处理时间,我们现在知道了我们需要在屏幕上移动东西的一切。在这里,我们将做一个基本的程序与一个点移动。//The dot that will move around on the screenclass Dot{ public: //点的尺寸 static const int DOT_WIDTH = 20; static const int DOT_HEIGHT = 20; //点的最大轴速

2020-12-30 02:42:18 586

翻译 SDL编程入门(25)限制帧率

限制帧率我们可以用SDL定时器做的另一件事是手动限制帧率。在这里,我们将禁用vsync,并保持最高帧率。//屏幕尺寸常量const int SCREEN_WIDTH = 640;const int SCREEN_HEIGHT = 480;const int SCREEN_FPS = 60;const int SCREEN_TICKS_PER_FRAME = 1000 / SCREEN_FPS;在这个演示中,我们将正常渲染我们的帧,但在帧的最后,我们将等待,直到帧时间完成。例如这里,当你想以6

2020-12-30 02:39:54 1521

翻译 SDL编程入门(24)计算帧率

计算帧率现在我们知道了如何用SDL制作定时器,是时候把它用起来了。我们将使用定时器来测量fps。//Main loop flagbool quit = false;//Event handlerSDL_Event e;//将文字颜色设置为黑色SDL_Color textColor = { 0, 0, 0, 255 };//每秒钟定时器的帧数LTimer fpsTimer;//内存中的文本流std::stringstream timeText;//开始计算每秒的帧数int

2020-12-30 02:37:38 985

翻译 SDL编程入门(23)高级定时器

高级定时器现在我们已经做了一个用SDL做的基本计时器,是时候做一个可以启动/停止/暂停的计时器了。//The application time based timerclass LTimer{ public: //Initializes variables LTimer(); //各种时钟操作 void start(); void stop(); void pause(); vo

2020-12-22 05:37:43 836

翻译 SDL编程入门(22)定时

定时任何类型的游戏API的另一个重要部分是处理时间的能力。在本教程中,我们将制作一个我们可以重新启动的计时器。//Using SDL, SDL_image, SDL_ttf, standard IO, strings, and string streams#include <SDL.h>#include <SDL_image.h>#include <SDL_ttf.h>#include <stdio.h>#include <string&g

2020-12-22 05:35:25 501

翻译 SDL编程入门(21)音效和音乐

音效和音乐到目前为止,我们只是在处理视频和输入。大多数游戏制作都需要某种声音,这里我们将使用SDL_mixer为我们播放音频。//Using SDL, SDL_image, SDL_mixer, standard IO, and strings#include <SDL.h>#include <SDL_image.h>#include <SDL_mixer.h>#include <stdio.h>#include <string>

2020-12-22 05:33:23 957

原创 Android 29: remount failed

Android 29模拟器用以前的方法去remount 会得到以下错误:Skip mounting partition: /productSkip mounting partition: /product_servicesSkip mounting partition: /productSkip mounting partition: /product_servicesSkip mounting partition: /productSkip mounting partition: /produ

2020-12-13 01:19:41 4006 5

翻译 SDL编程入门(20)触力反馈

触力反馈我们知道了如何用SDL使用操纵杆,现在我们可以使用新的触觉API来使控制器震动。//带有触力反馈的游戏控制器1处理程序SDL_Joystick* gGameController = NULL;SDL_Haptic* gControllerHaptic = NULL;触觉设备是一种能提供某种物理反馈的东西。在本例中,它使控制器发出隆隆声。触觉设备的数据类型直观地命名为SDL_haptic。//Initialize SDLif( SDL_Init( SDL_INIT_VIDEO | SD

2020-10-19 14:56:53 484

Android平台的Python3.5.so

重新编译的CrytaxNDK中的Python3.5so,可支持ssl,可在 Android的Armabi上运行的so

2018-09-24

gradle入门指南(离线版)

自己制作的gradle中文指南高清离线版,已经打包,比chm格式更友好

2018-02-03

JNI 完整高清手册(英文版)

JNI 完整全面的高清手册,想了解Android的Ndk开发的人而言,是必备资料

2018-01-14

tkinter关于ttk应用的详细教程

主要讲的tkinter的现代会界面,也就是着重于ttk的运用

2017-12-04

tkinter高清文档

python的tkinter文档,内容高清,涵盖知识完整,非常推荐

2017-12-04

Common Language Extension文档

CLE中间件支持多脚本语言混合编程。c/c++, lua, python, c#, ruby, java等语言可以通过CLE中间件直接使用其它语言中的类,函数,变量或者模块, 使得现有的功能库或者模块可以很容易的应用到其它编程语言中。开发者可以使用熟悉的语言编写功能库,然后在其它语言开发的应用中使用。CLE非常简单,其执行体仅为一个核心共享库和对应于每个脚本语言接口的共享库.

2017-11-18

Android 开发范例代码大全(第2版)

超清电子书,绝非扫描版

2017-01-01

Android编程权威指南

Android编程权威指南 Bill Phillips Brian Hardy 超高清PDF文档

2015-05-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除