Flutter engineFlutter Engine 不创建或管理线程,相应的由 embedder 创建管理、message loops.
embedder 提供了 task runner 来执行任务.
Dart VM 会有自己的线程池.而 Flutter engine 和 embedder 都无法访问到线程池的线程.
Task Runner ConfigurationFlutter engine 会向 embedder 申请4个 task runner 引用. engine 不在乎引用是不是同一个 task runner,或者多个 task runner 运行在同一个线程中.为了优化性能, embedder 应该为每个 task runner 分配一个单独的线程.虽然 engine 不关心 task runner 运行的线程情况,但是在 engine 的整个生命周期中线程配置应该保持一致.也就是如果 embedder 为task runner 分配了一个单独的线程,那么直到 engine 销毁,这个 task runner 都只能在这个线程运行.常用的 task runner ...
build-tool
使用 build_runner 作为开发服务1、在 pubspec.yaml中添加build_runner和build_web_compilers
12345environment: sdk: '>=2.0.0 <3.0.0'dev_dependencies: build_runner: ^1.0.0 build_web_compilers: ^0.4.0
2、下载依赖
1pub get
3、启动服务
1pub run build_runner serve
服务启动后,每次保存操作都会触发重新构建.
创建输出文件夹使用--output <directory name>选项构建,将内部引用 URL 匹配的文件路径和directory name合并作为输出目录,将文件写入.此选项可以在build,watch,serve命令中使用.如果没有使用 serve命令时,此目录同时被另一个不同的 server 使用.如果只想输出包的一部分,比如web目录,可以使用--output web:<directory name ...
Dart 是单线程模型,相对于 JavaScript,其也有 microTaskQueue 和 eventTaskQueue.
Zone 代表某个环境的稳定跨异步环境调用.
代码通常都执行在一个 zone中,如Zone.current.而main函数通常运行在默认的Zone.root上下文中.通过 runZoned 创建一个新zone 或 Zone.run 将代码运行到一个由 Zone.fork创建的上下文中.
开发者可以通过覆盖一个存在zone的一些方法来创建一个新zone.如自定义zone可以替换或修改print、timers、micortasks、uncaught erros 的默认行为.
Zone类不可以被继承.可以使用 fork 存在的 zone,通常是Zone.current和ZoneSpecification来自定义zone.这和继承Zone类来创建新的zone类似.
异步回调总是运行在其被规定的zone上下文中.使用一下步骤实现:
首先使用registerCallback、registerUnaryCallback、registerBinaryCallback中的一 ...
Kotlin Coroutine
提取函数-重构但是如果提取出来的函数包含了一个在当前作用域调用的协程构造器怎么办?这种情况下,suspend 修饰符就不能满足需求了使doWorld 成为 CoroutineScopr的一个扩展函数是一种解决方案,但这种方法使得API不清晰而不适用其他情况.理想的解决方案是CoroutineScope 作为一个包含目标函数的类的一个属性存在,或者这个类实现CoroutineScope接口.最后一种方案就是适用CoroutineScope(coroutineContext),但是这种方法会因为无法控制此方法的执行范围而表现出结构不安全性.只有一些私有 APIs 可以使用这个协程构造器.
类似守护线程的 Global CoroutinesGlobalScope启动的活动线程不会挂住线程,他们的行为类似守护线程.
取消与超时取消协程的执行在一个长时间运行的应用中,你可能需要精确控制后台运行的协程.例如用户可能关闭一个开启了协程的页面,那这个协程就需要被取消.launch函数返回一个Job对象可以取消此协程的执行.
同时取消协程可以同时取消.所有在 kot ...
Groovy MarkupTemplateEngine 主要面向生成类 XML(XML,XHTML,HTML5…)的标记语言,但是也支持其他基于内容的文本.和传统的模版引擎相比,此引擎支持基于 DSL 的 builder 语法.
123456xmlDeclaration()cars { carsh.each { car(make:it.make,model:it.model) }}
引用MarkupTemplateEngine支持引用来自另一个文件的内容.
另一份模版
原生内容
需要转义的内容
Podman 是什么? Podman 是一个非守护线程的容器引擎,支持在 Linux 系统上开发、管理和运行 OCI 容器.容器同时支持 root 身份和非 root 身份.只需要使用 alias docker=podman 就可以立即从 docker 切换到 podman.
安装
Arch Linux & Manjaro Linuxsudo pacman -S podman
Fedora,CentOSsudo yum -y install podman
Fedora-CoreOS,Fedora SilverBlue内置无需安装
Gentoosudo emerge app-emulation/libpod
MacOSbrew cask install podman
openSUSEsudo zypper install podman
openSUSE Kubic内置无需安装
RHEL712sudo subcription-manager repos --enable=rhel-7-server-extras-rpmssudo yum -y install podman
RHE ...
字符串根据布局约束可能跨越多行或者只显示在一行.
style 参数是可选的.如果忽略,默认使用最近的父组件的 DefaultTextStyle.如果给定的样式 TextStyle.inherit 属性为 true(默认),则给定的样式将和最近的父组件的 DefaultTextStyle 合并.这个合并操作很有用,例如使用默认的 font family 和大小使字体 bold.
使用 Text.rich 构造方法,Text 组件可以使用不同的 TextSpan 样式显示一段文字.
交互使用 GestureDetector 组件,设置 GestureDetector.onTap 处理器可以使 Text 响应 touch 事件.
在 material design 设计 app 中,可以使用 FlatButton 代替,如果不适合的话,最少都应该使用 InkWell 代替 GestureDetector.
为了使文本分部分交互,使用 RichText,在相关部分文本上指定 TapGestureRecognize 作为 TextSpan.recognizer.
继承 🌲Object > ...
显示图片的组件.
提供了以下几个不同用途的构造方法:
new Image: 从 ImageProvider 中获取图片.
new Image.asset: 使用 key 从 AssetBundle 中获取图片
new Image.network: 从 URL 中获取图片
new Image.file: 从 File 中获取图片
new Image.memory: 从 Uint8List 中获取图片
支持以下图片格式: JPEG,PNG,GIF,Animated GIF,WebP,Animated WebP,BMP,WBMP.
为了自动实现像素密度级的资产管理, 确保在 MaterialApp,WidgetsApp,MediaQuery组件树中使用 AssetImage 指定的 Image 组件.
图片是用 paintImage 画出来的,它包含了 Image 中的不同属性详情描述.
类似组件
Icon
new Ink.Image: 在 material app 中推荐使用(特别是图片在 Material 中,而且上面有 InkWell)
Image: dart:ui 提供
继承 ...
以垂直数组方式显示子组件的组件.
想要某个子组件扩展填充垂直空间,使用 Expanded 组件包装即可.
Column 组件不会滑动(通常如果 Column 中的多个子组件超出了可用空间,则会报错).如果有一排组件,而且想要在空间不足时能滑动,考虑使用 ListView.
横向排列考虑使用 Row.
如果只有一个子组件,考虑使用 Align 或 Center 定位组件.
如果传入的垂直约束是无边界的如果一个 Column 组件有一个或多个 Expanded 或 Flexible 组件,并且被放在另一个 Column 或 ListView 或其他不提供最大高度约束上下文的组件中,那么将会收到一个运行时异常,表明有非 0 flex 的子组件,但是其垂直约束是无边界的.
正如异常表现出来的问题,使用 Flexible 或 Expanded 意味着接下来布局其他的子组件时必须把剩余的空间平均分配,而如果传入的垂直约束是无边界的话,剩余的空间就变成无限的.
解决该问题的关键在于为什么 Column 会接收到无边界的垂直约束.
一个可能的原因是 Column 被放在了另一个 Column (内部 ...