flutter 组件(使用Flutter + V8/JsCore开发小程序引擎(一))

:暂无数据 2026-07-17 21:10:09 :0

flutter 组件(使用Flutter + V8/JsCore开发小程序引擎(一))

这篇文章给大家聊聊关于flutter 组件,以及使用Flutter + V8/JsCore开发小程序引擎(一)对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

使用Flutter + V8/JsCore开发小程序引擎(一)

众所周知,小程序是由HTML标签来开发原生组件,那么首先需要将HTML做解析,这里我们将HTML通过node脚本解析成JSON字符串,再用Dart来解析JSON,映射对应的标签到flutter的组件。这里先简单介绍实现的功能以及展示效果,后续再详细介绍。

为了高效解析,直接用flutter的组件名在HTML文件上开发

直接使用flutter的组件

模仿微信小程序的Api,cc对应是微信小程序的wx

以上HTML中的例子

《使用Flutter + V8/JsCore开发小程序引擎(二)》

《使用Flutter + V8/JsCore开发小程序引擎(三)》

Flutter简介

为什么我们要选择flutter语言呢?它有哪些优点呢?

*1.flutter将会帮你更容易,更快速的开发出界面美观的移动应用。
*2.是谷歌的亲儿子
*3.支持热重载 :android原生开发会遇到编译-打包-安装三个步骤。开发效率迟迟得不到提升。热重载技术在flutter内完美体现。
*4.支持垮平台:flutter基于图像回执引擎进行渲染,在不同平台下绘制效果绝对是一致的,能做到真正的跨平台,一处写,处处运行。
*5.性能优异性:不同于H5通过DOM渲染和RN映射组件,flutter直接基于native进行绘制。性能上完全超过原生。

*1.Dart语法编译:Dart是一种强类型、跨平台的客户端开发语言。具有专门为客户端优化、高生产力、快速高效、可移植易学的风格。Dart主要由谷歌负责开发和维护。
*2.Flutter插件:Flutter使用的Dart语言无法直接调用iOS系统提供的OC或swift接口,这时就需要使用插件来实现中转。Flutter官方提供了丰富的原生接口封装

Flutter分为三大部分
*1.由Dart语言负责的Framwork层。
*2.Dart语法执行器。
*3.Skia图像处理引擎。05年就被研发成功了(谷歌的全家桶都是由谷歌的Skia图像处理引擎绘制的,iOS目前的图像处理引擎是JPEG,其中Skia是对JPEG的二次封装。)

*1.2005年Skia图像处理引擎成立,用来展示Chrome,火狐和其他谷歌自己的产品使用。
*2.2007年第一个安卓系统问世,于是谷歌开发者将Skia移植到安卓平台。
*3.Skia作为一个2D的图像系统,包含绘制,渲染,显示图片都是Skia完成。安卓中的3D部分是由OpenGLES来实现的,其中OpenGL ES是OpenGL的嵌入式版本。

3. Flutter - 基础组件 之 Text

Text继承自 StatelessWidget ,Text 主要通过设置 文本布局 及 文本样式 控制显示方式。

1. 文本布局: 例如文本对齐方式 textAlign 、文本排版方向 textDirection ,文本显示最大行数 maxLines 、文本截断规则 overflow 等等

2 文本样式: 如字体名称 fontFamily 、字体大小 fontSize 、文本颜色 color 、文本阴影 shadows 等等,这些参数被统一封装到了构造函数中的参数 style(TextStyle) 中

  在iOS中,我们可以使用NSAttributedString进行富文本设置。在Flutter中 我们可以通过 Text.rich() 或 RichText() 进行富文本设置。

两者均为 InlineSpan 类型, InlineSpan 为抽象类。

抽象类不能直接实例化。Flutter已为我们提供了

且 WidgetSpan 继承自 PlaceholderSpan

Flutter:手把手教你使用滚动型列表组件:ListView

ListView的基础创建使用有三种方式:

通过默认构造函数来创建列表,应用场景 = 短列表

这种方式创建的列表存在一个问题:对于那些长列表或者需要较昂贵渲染开销的子组件,即使还没有出现在屏幕中但仍然会被ListView所创建,这将是一项较大的开销,使用不当可能引起性能问题甚至卡顿。

长列表

列表子项之间需要分割线

ListView的进阶使用主要包括:下拉刷新 & 上拉加载

在Flutter中,ListView结合RefreshIndicator组件实现下拉刷新

通过包裹一层RefreshIndicator,自定义onRefresh回调方法实现

方式有两种:

通过ListView.controller属性可以判断ListView是否滑动到了底部,再进行上拉加载

NotificationListener是一个Widget,可监听子Widget发出的Notification

ListView在滑动时中会发出ScrollNotification类型的通知,可通过监听该通知得到ListView的滑动状态,判断是否滑动到了底部,从而进行上拉加载

NotificationListener有一个onNotification属性,定义了监听的回调方法,通过它来处理加载更多逻辑

不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。

【Flutter】多组件共用状态,父组件状态传递给子组件

场景:多个组件共用一个状态,子组件通过方法改变父组件状态
思路:状态和管理方法定义在父组件,通过构造函数传递给子组件

其他子组件按照同样方法接收即可共用该父组件的状态。

flutter 组件之间怎么设置相对距离

1.使用sizebox保持间距

2.使用Spacer填充尽可能大的空间
Row(
children: 《Widget》[
Text("1"),
Spacer(), // use Spacer
Text("2"),
],
)

3.使用mainAxisAlignment对齐方式控制彼此间距

4.如果不用行的话,还可以使用Wrap并指定spacing

5)同样是使用Wrap,设置spaceAround
Wrap(
alignment: WrapAlignment.spaceAround, // 空白包围住元素
children: 《Widget》[
Text("1"),
Text("2"),
],
)
该方案来自于 这位博主请点击查看

Flutter组件(Widget)的局部刷新方式

Flutter中有两个常用的状态Widget分为StatefulWidget和StatelessWidget,分别为动态视图和静态视图,视图的更新需要调用StatefulWidget的setState方法,这会遍历调用子Widget的build方法。如果一个页面内容比较复杂时,会包含多个widget,如果直接调用setState,会遍历所有子Widget的build,这样会造成很多不必要的开销,所以非常有必要了解Flutter中局部刷新的方式:

globalkey唯一定义了某个element,它使你能够访问与element相关联的其他对象,例如buildContext、state等。应用场景:跨widget访问状态。
例如:可以通过key.currentState拿到它的状态对象,然后就可以调用其中的onPressed方法。

Flutter框架内部提供了一个非常小巧精致的组件,专门用于局部组件的刷新。适用于值改动的刷新。

实现原理:在 initState 中对传入的可监听对象进行监听,执行 _valueChanged 方法,_valueChanged 中进行了 setState 来触发当前状态的刷新。触发 build 方法,从而触发 widget.builder 回调,这样就实现了局部刷新。可以看到这里回调的 child 是组件传入的 child,所以直接使用,这就是对 child 的优化的根源。

可以看到 ValueListenableBuilder 实现局部刷新的本质,也是进行组件的抽离,让组件状态的改变框定在状态内部,并通过 builder 回调控制局部刷新,暴露给用户使用。

通过这个可以创建一个支持局部刷新的widget树,比如你可以在StatelessWidget里面刷新某个布局,但是不需要改变成StatefulWidget;也可以在StatefulWidget中使用做部分刷新而不需要刷新整个页面,这个刷新是不会调用Widget build(BuildContext context)刷新整个布局树的。

异步UI更新:
很多时候我们会依赖一些异步数据来动态更新UI,比如在打开一个页面时我们需要先从互联网上获取数据,在获取数据的过程中显示一个加载框,等获取到数据时我们再渲染页面;又比如我们想展示Stream(比如文件流、互联网数据接收流)的进度。当然StatefulWidget我们完全可以实现以上功能。但由于在实际开发中依赖异步数据更新UI的这种场景非常常见,并且当StatefulWidget中控件树较大时,更新一个属性导致整个树重建,消耗性能,因此Flutter专门提供了FutureBuilder和SteamBuilder两个组件来快速实现这种功能。

通常情况下,子Widget无法单独感知父Widget的变化,当父state变化时,通过其build重建所有子widget;
InheriteddWidget可以避免这种全局创建,实现局部子Widget更新。InheritedWidget提供了一种在Widget树中从上到下传递、共享数据的方式。Flutter SDK正是通过InheritedWidget来共享应用主题和Locale等信息。
InheritedWidgetData

TestData

InheritedTest1Page

provider是Google I/O 2019大会上宣布的现在官方推荐的管理方式,而ChangeNotifierProvider可以说是Provider的一种:
yaml文件需要引入provider: ^3.1.0
顶层嵌套ChangeNotifierProvider

创建共享数据类DataInfo:
数据类需要with ChangeNotifier 以使用 notifyListeners()函数通知监听者更新界面。

使用Provider.of(context)获取DataInfo

nextPage:
使用Consumer包住需要使用共享数据的Widget

RepaintBoundary就是重绘边界,用于重绘时独立于父视图。页面需要更新的页面结构可以用 RepaintBoundary组件嵌套,flutter 会将包含的组件独立出一层"画布",去绘制。官方很多组件 外层也包了层 RepaintBoundary 标签。如果你的自定义view比较复杂,应该尽可能的避免重绘。

以上总结了几种Flutter的局部刷新的方式,可根据实际需要使用不同的方式,最适合的才是最好的。

Flutter 之 弹性布局 (Row、Column) (十一)

弹性布局允许子组件按照一定比例来分配父容器空间

Flex组件和Row、Column属性主要的区别就是多一个direction。
当direction的值为Axis.horizontal的时候,则是Row。
当direction的值为Axis.vertical的时候,则是Column。

它们之中都有主轴(MainAxis)和交叉轴(CrossAxis)的概念:

Row可以沿水平方向排列其子widget。定义如下:

示例1 - 基本使用

示例2 - 基线对齐
基线是英文字母X的下端两点连成的一条线

示例3 - 水平方向包裹

Column可以沿垂直方向排列其子widget。定义如下:

Column 基本使用 示例

再看一个示例

运行效果如下:

我们发现文本并没有居中?

解释:

实际上,Row和Column都只会在主轴方向占用尽可能大的空间,而交叉轴的长度则取决于他们最大子元素的长度。如果我们想让本例中的两个文本控件在整个手机屏幕中间对齐,我们有两种方法:

运行效果如下:

如果Row里面嵌套Row,或者Column里面再嵌套Column,那么只有最外面的Row或Column会占用尽可能大的空间,里面Row或Column所占用的空间为实际大小,下面以Column为例说明

如果要让里面的Column占满外部Column,可以使用Expanded 组件:

flutter android 原生浮窗组件 android_window 介绍

***隐藏网址***
***隐藏网址***

修改 MainActivity.kt 让 MainActivity 继承 qiuxiang.android_window.AndroidWindowActivity :

创建 MainApplication.kt :

修改 AndroidManifest.xml 的 《application》 新增属性 android:name=".MainApplication" :

main.dart:

我们需要用 @pragma(’vm:entry-point’) 声明一个入口函数,默认函数名是 androidWindow ,当然你可以随意指定一个,只是调用 open 的时候需要同时指定参数 entryPoint: 。

android_window.dart:

浮窗 app 的写法就和我们平时写的 app 没什么区别了,如果需要支持窗口拖拽移动,则要在最外层使用 AndroidWindow 。

最终效果:

***隐藏网址***

主应用和浮窗都有 post 和 setHandler 方法用于发送消息以及设置监听处理函数。用法举例:

主应用发送消息到浮窗:

浮窗监听并处理主应用消息:

反过来同理。

关于flutter 组件,使用Flutter + V8/JsCore开发小程序引擎(一)的介绍到此结束,希望对大家有所帮助。

flutter 组件(使用Flutter + V8/JsCore开发小程序引擎(一))

本文编辑:admin

更多文章:


form表单制作(为什么制作的form表单会在网页显示中多出一行)

form表单制作(为什么制作的form表单会在网页显示中多出一行)

大家好,如果您还对form表单制作不太了解,没有关系,今天就由本站为大家分享form表单制作的知识,包括为什么制作的form表单会在网页显示中多出一行的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月11日 09:10

teammate(teammate,company,partner)

teammate(teammate,company,partner)

各位老铁们,大家好,今天由我来为大家分享teammate,以及teammate,company,partner的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧

2026年10月11日 06:10

javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)

javascript arraybuffer(javascript可以把base64编码转换成二进制代码吗求示例代码!)

其实javascript arraybuffer的问题并不复杂,但是又很多的朋友都不太了解javascript可以把base64编码转换成二进制代码吗求示例代码!,因此呢,今天小编就来为大家分享javascript arraybuffer的

2026年10月11日 04:00

text函数公式(excel中round和text函数的区别是什么)

text函数公式(excel中round和text函数的区别是什么)

“text函数公式”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看text函数公式(excel中round和text函数的区别是什么)!

2026年10月11日 03:50

pascal编程软件(介绍一下pascal语言!)

pascal编程软件(介绍一下pascal语言!)

大家好,如果您还对pascal编程软件不太了解,没有关系,今天就由本站为大家分享pascal编程软件的知识,包括介绍一下pascal语言!的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月11日 02:40

google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)

google chrome打不开(chrome浏览器打不开怎么回事 浏览器打不开的处理方法)

本篇文章给大家谈谈google chrome打不开,以及chrome浏览器打不开怎么回事 浏览器打不开的处理方法对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了

2026年10月11日 02:00

websocket整合springboot(Springboot整合Websocket遇到的坑)

websocket整合springboot(Springboot整合Websocket遇到的坑)

大家好,websocket整合springboot相信很多的网友都不是很明白,包括Springboot整合Websocket遇到的坑也是一样,不过没有关系,接下来就来为大家分享关于websocket整合springboot和Springbo

2026年10月11日 01:40

小米官方首爆miui14(miui14耗电严重官方回应)

小米官方首爆miui14(miui14耗电严重官方回应)

各位老铁们好,相信很多人对小米官方首爆miui14都不是特别的了解,因此呢,今天就来为大家分享下关于小米官方首爆miui14以及miui14耗电严重官方回应的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月11日 00:40

drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)

drawerlayout(android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕)

本篇文章给大家谈谈drawerlayout,以及android 怎样让drawerlayout设置的侧滑菜单的内容充满屏幕对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月10日 19:20

xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)

xor四位数怎么运算(单片机怎样用C语言实现4个数字间的异或)

大家好,今天小编来为大家解答以下的问题,关于xor四位数怎么运算,单片机怎样用C语言实现4个数字间的异或这个很多人还不知道,现在让我们一起来看看吧!

2026年10月10日 17:50

最近更新

thinkpade470c加内存条(thinkpad e470c内存条是什么牌子如果要添加4g内存什么牌子比较好)
2026-10-11 09:00:03 浏览:0
frontpage的主要功能(frontpage是什么)
2026-10-11 08:40:18 浏览:0
ideapad15alc7能玩什么游戏(联想ideapad15可以玩刺客信条启示录吗)
2026-10-11 08:10:05 浏览:0
热门文章

打印机m7400(m7400打印机清零方法)
2026-08-29 07:50:01 浏览:5
acrobat各版本区别(Acrobat XI Pro与 Acrobat PRO DC什么区别)
2026-08-29 22:30:20 浏览:2
联想y510p怎么升级(联想y510p换cpu)
2026-08-17 03:30:04 浏览:2
标签列表