普通视图
热门中概股美股盘前多数下跌,阿里巴巴跌超2%
美股大型科技股盘前涨跌不一,苹果涨超1%
被蚂蚁、移动投资,这家机器人公司说:“2026年交付必有一战”
文|富充
编辑|苏建勋
“2026年,具身智能行业会打响第一场交付之战。不能按时按质交付的公司,会被直接淘汰。”
上海,钛虎机器人的会议室里,公司CEO易港在和《智能涌现》的访谈刚开场,便抛出这个明确的判断。
成立五年的钛虎,是具身智能供应链企业,主要生产机器人关节模组,业务也包括组装机器人的。2025年,钛虎的新工厂扩建完成,公司将关节模组的年产能从3万个提升至10万个,一年之间扩了三倍;人形机器人的组装能力也从无至有来到每年3000台。
公司走廊的一面墙上,展示了钛虎近乎所有客户的LOGO,从自动驾驶、扫地机器人,到移动杭研、蚂蚁灵波等知名具身智能企业,都是它的客户。
在行业普遍被机器人量产出货所困的当下,产能为钛虎带来了订单,也带来了蚂蚁集团、中国移动、经纬创投、商汤国香等知名机构的投资。
易港属于那种金句频出的采访对象。
“过度承诺,导致信任危机,2026年就会原形毕露”,
“作为创始人,拒绝订单的能力,比拿单的能力更重要”,
“构建信任链的难度,远远比构建一个供应链的难度要大得多”。
![]()
△图钛虎生产的关节模组,图片:采访人提供
这位化学专业出身的“95后”创业者,上大一时候就喜爱上了机器人,为此他还跟自己的导师借钱研发自己的第一只灵巧手。
易港用“一穷二白”形容自己的创业起点。并没有那么多企业管理经验的他,喜欢从重大历史事件中获取有关公司战略的思路。
比如谈及“只做供应链生意会不会有点不性感”时,会引用了革命时期“农村包围城市”的打法。这被用来说明选择一条当下艰苦、但前景可能更广阔的方向做深,长期看更有价值。
作为具身智能产业链里贴近交付侧的从业者,易港指出,行业在2025年陷入“接大订单”的狂欢,却严重低估了从设计到量产出货的全链条复杂度。
他举了两个亲身经历的例子。
一个是关于工期。2024年,钛虎的一家供应商曾承诺“国庆节打包发货”,结果拖到次年四月才交货,这也导致了自己向客户交货出现延期。
另一个关于品质。一批零部件首批测试表现不错后,易港决定放量采购用于规模化生产。结果同一供应商的第二批零部件不良率高达85%,直接冲击钛虎与下游客户的信任关系,供应商反复承诺改进却屡屡落空。
供应商多次画饼却难以兑现,对易港来说无比煎熬。这也是他把整个环节亲自跑一遍,然后自建产线的主要原因:要把“保底”能力握在自己手里。
“2024、2025年,如果机器人公司接了订单交付不了,或许还有‘复活卡’。”易港说,“但到了2026年,交付违约拖垮的将不只是口碑,更是公司的现金流。”
在他看来,这场“交付之战”的生存法则并非追逐越来越多的订单,而是确保尽量别“掉链子”。
![]()
△钛虎CEO易港,图片:采访人提供
以下是与易港的对话,内容经作者整理:
机器人会走了,但交付体系先摔了一跤
智能涌现:为什么2026年会成为“交付第一战”的关键节点?
易港: 2025年行业披露的订单很多,但普遍存在“接单容易交付难”的问题。过去两年,因为大家都在摸索,客户相对耐心,投资人也愿意持续输血。
但从2025年下半年的实际情况来看,一些具身智能公司已经很难融到钱了。到了2026年,如果企业仍在交付上“掉链子”,没有现金流输入,资金链可能断裂。届时将面临生死存亡的考验。
智能涌现:当前机器人交付的核心难点究竟是什么?
易港:交付不是简单的“生产”环节,而是一个“喇叭口”——它包含设计、采购、装配、测试、联调、返工、售后全链条。问题在于,这个链条太新了,每个环节本身就有坑,环节之间更缺乏磨合。
而且,很多产品连50台、100台的“小批量爬坡”都没走完,就直接承接大订单。结果就是产线排期混乱、人员短缺等问题集中爆发。
智能涌现:去年行业常披露“上千台级订单”,钛虎的成绩如何?看到别人接单量大,会焦虑吗?
易港: 我们大尺寸人形机器人去年出货约170台。看到别人的订单数字,我确实曾自我怀疑。但投资人告诉我,很多公司接了单也生产不出来,我们的交付能力在业内已算靠前。
我现在反而不焦虑了。市场就像宇宙大爆炸,空间拓展比光速还快,你永远追不上,也无需追上。只要能实打实交付,未来十年都不会缺市场。
智能涌现:你的意思是说,披露的那么多订单,如果全部生产出来是件很难的事?
易港:是的,你看这里面有一些是框架协议,它更多表明的是客户下单的意向,但并不是这些订单全都要、或者全都能被生产出来。
智能涌现:所以“拒绝订单”反而成了核心能力?
易港: 是的。创始人首先要能筛选订单,其次要敢于抵抗订单的诱惑。必须清楚自己公司的能力边界在哪里。
有些公司为了融资、造势,在交付周期、产量、性能上“过度承诺”。这就像向上天借高利贷,最可怕的是,你借了却还不上,失去了客户的信任,就失去了一切。
智能涌现:从售后看,目前行业的产品交付水平到底如何?
易港: 即便是做得最好的1.7米级人形机器人,目前也需要高频返厂维修。故障点很多。因为机器人的工况极其复杂。汽车主要是上下震动,但机器人有上下、前后、左右以及三个姿态角的六维震动。在这种环境下,螺栓断裂、电缆失效等各种问题都可能发生。所以我接单的时候会倾向于让客户了解真实情况,不仅不要在品质上做过度承诺,还会把客户的预期拉低点。
智能涌现:你选择自建产线,是因为被供应商“坑”过吗?
易港: 是的。2024年,一个我的零部件供应商,在10月时跟我说“马上打包发货”,结果拖到第二年4月才真正交付。这导致我们对客户也过度承诺了,最终交付延误了一两个月,后续还出现了别的各种各样的问题。
幸运的是我的客户在时间规划上留了余量,没形成太大损失。但这件事让我们意识到:必须有自己的保底能力,不能把生产完全交给别人。
![]()
△2025年,钛虎成立的新工厂,图片:采访人提供
行业早期,先造好“瓶子”
智能涌现:钛虎自己也做机器人整机,比如1.7m身高的“瑶光”,不怕和客户竞争吗?
易港: 不会。我们只组装硬件,但并不自己做模型。也就是说,我们造的是“瓶子”,但我们自己不做“水”的生意。
我们提供的是硬件参考解决方案,就像芯片公司提供开发板,或像树莓派。目的是降低客户的使用门槛,而非自己下场卖机器人。
智能涌现:这个“瓶子”对客户具体有什么用?
易港: 客户可以在“瑶光”的基础上提需求,比如要更长,胯部要更灵活。这样最快两个月就能做出机器人,半年可以实现小批量量产。
我们解决了从电机选型、结构设计到布线的底层难题,客户无需从零开始。如果没有这套方案,客户要从三五十个电机和多种构型中摸索,过程会非常漫长。
智能涌现:大公司资源雄厚,做机器人有时还会比创业公司慢吗?
易港: 是的。这涉及对新业务的认知和整合问题。
一些制造业巨头自动化程度很高,但对机器人技术和供应链缺乏了解,会用传统节奏过于乐观地估算时间。我见过要求团队“两个月从零到走起来”的,因为他们习惯了消费电子的迭代速度。
此外,大公司可能在欧美收购顶尖团队,每个部分都是世界级的。但整合时,内部是“兄弟部门”而非甲乙方关系,容易陷入扯皮和内耗。把顶尖组织粘合在一起,可能比技术本身更耗时。
结果常常是:磨合两年没出成果,团队被裁;或好不容易出成果,领导变更,新领导倾向其他的方案。然后陷入重新招人、重新磨合的循环。
智能涌现:关节模组常被视为“按斤卖”的生意,似乎技术壁垒有限,估值也不如整机高。你为什么选这条“不性感”的赛道?
易港: 我不认同这种看法。关节模组往深了做,是片工程深水区。现在看似性感的领域,随着竞争加剧,光环可能迅速消退。
我有两个比喻:一是革命时期“农村包围城市”的路线:在敌军统治力量比较薄弱的地方,当下条件艰苦但前景可能更广阔,长期看更有价值。
二是锂电池——我大学学化学,知道合成一种电极材料一天就够了,看似简单。但把能量密度提高、一个汽车电池包成本从40万降到4万、可靠性做到极致,需要千亿投入和漫长攀登,而这正是真正的壁垒和利润所在。
智能涌现:你对人形机器人市场的节奏如何判断?
易港: 我认为有两个关键节点:
第一波是2026至2028年,全球出货量可能冲击百万台。经历“交付之战”,会死掉一批公司,也会跑出几十家优秀的企业。
行业真正爆发应该会在2030至2035年,那将是社会级变革。这也解释了钛虎的策略,即在上游服务好客户,先确保活到那个时代,而非在早期的整机红海中耗尽元气。
九鼎新材:子公司拟收购九鼎新能源100%股权
开普检测:董事长拟减持公司不超3%股份
宇树成为2026年春晚机器人合作伙伴
蓝特光学:2025年净利润同比预增70.04%到81.38%
东方日升:2025年预亏23亿元—29亿元
和顺电气:2025年预亏4200万元—4920万元
青木科技:2025年净利润同比预增30%—50%
中国人民银行召开2026年宏观审慎工作会议
美国稀土公司:已与美国政府签署意向书以获取16亿美元资金
我尝试将TinyPro集成TinyEngine低代码设计器了
TinyPro 与 TinyEngine 是 OpenTiny 开源生态的重要组成部分:
- TinyPro 提供企业级后台系统模板
- TinyEngine 提供灵活强大的低代码引擎
本项目在 TinyPro 中深度集成了基于 TinyEngine 的低代码设计器,通过 插件化架构 构建出可扩展的低代码开发平台。
借助它,你只需在可视化设计器中完成页面设计,就能一键导入 TinyPro,并自动生成菜单、权限及国际化配置,实现真正的 “所见即所得” 式开发体验。
整体架构
lowcode-designer/
├── src/
│ ├── main.js # 应用入口
│ ├── composable/ # 可组合逻辑
│ ├── configurators/ # 配置器
├── registry.js # 插件注册表
├── engine.config.js # 引擎配置
└── vite.config.js # 构建配置
![]()
核心组成部分
- TinyEngine 核心:提供低代码设计器的基础能力
- 插件系统:通过插件扩展功能
- 注册表机制:统一管理插件和服务
- 配置器系统:自定义组件属性配置
核心特性
- ✨ 智能代码生成:基于可视化设计自动生成符合 TinyPro 规范的 Vue 3 + TypeScript 代码
- 🔐 自动认证管理:智能获取和管理 API Token,支持多种认证方式
- 🎯 一键集成:自动创建菜单、配置权限、添加国际化词条
- 🛠️ 代码转换:将 TinyEngine 生成的代码自动转换为 TinyPro 项目兼容格式
- 💾 本地保存:支持将生成的文件保存到本地文件系统
- 🎨 可视化配置:提供友好的 UI 界面进行菜单和路由配置
快速开始
安装
使用 TinyCli 可以快速初始化 TinyPro 模版
tiny init pro
![]()
启动低代码设计器
cd lowcode-designer
pnpm install
pnpm dev
启动前端与后端
cd web
pnpm install
pnpm start
cd nestJs
pnpm install
pnpm start
启动完成后,访问 👉 http://localhost:8090 即可体验低代码设计器。
使用流程
![]()
设计页面:在 TinyEngine 可视化编辑器中设计页面
![]()
点击出码按钮:点击工具栏中的”出码”按钮
![]()
配置菜单信息:在弹出的对话框中填写菜单配置信息
生成预览:点击”生成预览”查看将要生成的文件
![]()
完成集成:点击”完成集成”自动创建菜单、分配权限并保存文件
![]()
接下来我们就可以直接去 TinyPro 直接看到页面效果
![]()
TinyPro Generate Code 插件解析
插件目录结构
generate-code-tinypro/
├── package.json # 插件包配置
├── src/
│ ├── index.js # 插件入口
│ ├── meta.js # 元数据定义
│ ├── Main.vue # 主组件
│ ├── SystemIntegration.vue # 功能组件
│ ├── components/ # 通用组件
│ │ ├── ToolbarBase.vue
│ │ ├── ToolbarBaseButton.vue
│ │ └── ToolbarBaseIcon.vue
│ ├── composable/ # 可组合逻辑
│ │ ├── index.js
│ │ └── useSaveLocal.js
│ └── http.js # HTTP 服务
├── vite.config.js # 构建配置
└── README.md # 文档
代码生成流程
const generatePreview = async () => {
// 1. 获取当前页面的 Schema
const currentSchema = getSchema();
// 2. 获取应用元数据(i18n、dataSource、utils等)
const metaData = await fetchMetaData(params);
// 3. 获取页面列表和区块信息
const pageList = await fetchPageList(appId);
const blockSchema = await getAllNestedBlocksSchema();
// 4. 调用代码生成引擎
const result = await generateAppCode(appSchema);
// 5. 过滤和转换生成的代码
const transformedFiles = filteredFiles.map((file) => ({
...file,
fileContent: transformForTinyPro(file.fileContent),
}));
};
TinyPro 与 TinyEngine 通信
当用户在低代码设计器中点击“完成集成”时,插件首先通过 Token Manager 向认证接口 /api/auth/api-token 请求并获取访问凭证(Token),随后利用该 Token 调用一系列后台接口,包括国际化 API、菜单 API 和角色 API。插件通过这些接口自动完成 页面国际化词条创建、菜单注册、角色查询与权限分配 等步骤。整个过程中,HTTP Client 统一负责与后端通信,而返回的数据(菜单信息、角色信息、权限配置等)会实时更新到本地,最终实现了从页面设计到系统集成的一键闭环,使 TinyEngine 生成的页面能无缝接入 TinyPro 系统。
![]()
总结
通过 TinyPro 与 TinyEngine 的深度融合,我们实现了从「可视化设计」到「系统集成」的完整闭环,让不会写代码的用户也能轻松构建出高质量的前端页面。
用户只需拖拽组件、填写配置、点击“出码”,插件便会自动生成符合 TinyPro 标准的代码,并完成菜单、权限、国际化等系统级配置。
这一过程无需手动修改代码或后台配置,就能一键完成页面创建、接口绑定与权限分配,实现真正意义上的「低门槛、高效率、可扩展」的前端开发体验。
关于OpenTiny
欢迎加入 OpenTiny 开源社区。添加微信小助手:opentiny-official 一起参与交流前端技术~
OpenTiny 官网:opentiny.design
OpenTiny 代码仓库:github.com/opentiny
TinyPro 源码:github.com/opentiny/ti…
TinyEngine 源码: github.com/opentiny/ti…
欢迎进入代码仓库 Star🌟TinyPro、TinyEngine、TinyVue、TinyNG、TinyCLI、TinyEditor~
如果你也想要共建,可以进入代码仓库,找到 good first issue 标签,一起参与开源贡献~
中农联合:2025年度预亏1.28亿元—1.65亿元
Flutter-使用Gal展示和保存图片资源
Gal 是 Flutter 生态中一款轻量、高性能的图片管理与预览插件,专为简化 Flutter 应用中图片选择、预览、保存等核心场景设计。它封装了原生平台的图片处理能力,提供统一的 API 接口,让开发者无需关注 iOS/Android 底层差异,快速实现专业级的图片交互体验。
1. Gal 插件核心功能
Gal 插件的核心价值在于跨平台一致性和易用性,主要覆盖以下场景:
- 图片预览:支持单张/多张图片的沉浸式预览,包含缩放、滑动切换、手势返回等交互;
- 相册操作:读取设备相册、筛选图片/视频、获取图片元信息(尺寸、路径、创建时间);
- 图片保存:将网络图片/本地图片保存到系统相册,自动处理权限申请;
- 权限管理:封装相册读写权限的申请与状态检测,适配 iOS/Android 权限机制差异;
- 性能优化:内置图片懒加载、内存缓存策略,避免大图集加载时的卡顿问题。
2. 核心 API 与属性详解
2.1. 基础配置
使用 Gal 前需先完成初始化,并配置权限相关参数(pubspec.yaml 配置):
使用最新版本:
dependencies:
gal: ^2.1.0 # 建议使用最新稳定版
Android:
# Android 权限配置(android/app/src/main/AndroidManifest.xml)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
iOS:
# iOS 权限配置(ios/Runner/Info.plist)
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以选择/保存图片</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要写入权限以保存图片到相册</string>
2.2. 核心 API 列表
| API 方法 | 功能描述 | 参数说明 | 返回值 |
|---|---|---|---|
Gal.requestPermission() |
申请相册读写权限 |
type: 权限类型(PermissionType.read/write) |
Future<bool>: 是否授权成功 |
Gal.getPhotos() |
获取相册图片列表 |
limit: 加载数量(默认全部)albumId: 指定相册 ID(可选) |
Future<List<GalPhoto>>: 图片信息列表 |
Gal.preview() |
预览图片 |
photos: 图片列表initialIndex: 初始预览索引backgroundColor: 预览背景色 |
Future<void> |
Gal.saveImage() |
保存图片到相册 |
path: 图片本地路径/网络 URLalbumName: 自定义相册名称(可选) |
Future<bool>: 是否保存成功 |
Gal.getAlbums() |
获取设备相册列表 | - |
Future<List<GalAlbum>>: 相册信息列表 |
2.3. 关键数据模型
GalPhoto(图片信息模型)
class GalPhoto {
final String id; // 图片唯一标识
final String path; // 本地路径
final String? url; // 网络图片 URL(可选)
final int width; // 图片宽度
final int height; // 图片高度
final DateTime createTime; // 创建时间
final String mimeType; // 图片类型(image/jpeg 等)
}
GalAlbum(相册信息模型)
class GalAlbum {
final String id; // 相册唯一标识
final String name; // 相册名称
final int count; // 相册内图片数量
final String? coverPath; // 相册封面路径
}
3. 图片选择与预览功能Demo
以下是一个完整的 Demo,实现「获取相册图片 → 列表展示 → 点击预览 → 保存图片」的核心流程。
3.1 完整代码
import 'package:flutter/material.dart';
import 'package:gal/gal.dart';
import 'package:permission_handler/permission_handler.dart';
void main() => runApp(const GalDemoApp());
class GalDemoApp extends StatelessWidget {
const GalDemoApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Gal 插件 Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const GalDemoPage(),
);
}
}
class GalDemoPage extends StatefulWidget {
const GalDemoPage({super.key});
@override
State<GalDemoPage> createState() => _GalDemoPageState();
}
class _GalDemoPageState extends State<GalDemoPage> {
List<GalPhoto> _photos = [];
bool _isLoading = false;
// 申请相册权限
Future<bool> _requestPermission() async {
final status = await Permission.photos.request();
return status.isGranted;
}
// 加载相册图片
Future<void> _loadPhotos() async {
setState(() => _isLoading = true);
try {
final hasPermission = await _requestPermission();
if (!hasPermission) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('请授予相册访问权限')),
);
}
return;
}
// 获取相册图片(限制加载20张,避免性能问题)
final photos = await Gal.getPhotos(limit: 20);
setState(() => _photos = photos);
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('加载图片失败:$e')),
);
}
} finally {
setState(() => _isLoading = false);
}
}
// 预览图片
void _previewPhoto(int index) async {
await Gal.preview(
photos: _photos,
initialIndex: index,
backgroundColor: Colors.black,
);
}
// 保存示例图片到相册
Future<void> _saveSampleImage() async {
const sampleImageUrl = 'https://picsum.photos/800/600';
try {
final success = await Gal.saveImage(
sampleImageUrl,
albumName: 'Gal Demo', // 自定义相册名称
);
if (success) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('图片保存成功')),
);
// 保存后重新加载图片列表
_loadPhotos();
}
}
} catch (e) {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('保存失败:$e')),
);
}
}
}
@override
void initState() {
super.initState();
// 页面初始化时加载图片
_loadPhotos();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Gal 图片管理 Demo'),
actions: [
IconButton(
icon: const Icon(Icons.save),
onPressed: _saveSampleImage,
tooltip: '保存示例图片',
),
],
),
body: _buildBody(),
);
}
Widget _buildBody() {
if (_isLoading) {
return const Center(child: CircularProgressIndicator());
}
if (_photos.isEmpty) {
return const Center(child: Text('暂无图片,请检查权限或相册内容'));
}
// 网格展示图片
return GridView.builder(
padding: const EdgeInsets.all(8),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, // 每行3列
crossAxisSpacing: 4,
mainAxisSpacing: 4,
childAspectRatio: 1, // 宽高比1:1
),
itemCount: _photos.length,
itemBuilder: (context, index) {
final photo = _photos[index];
return GestureDetector(
onTap: () => _previewPhoto(index),
child: Image.file(
File(photo.path),
fit: BoxFit.cover,
errorBuilder: (context, error, stackTrace) {
return const Icon(Icons.broken_image, color: Colors.grey);
},
),
);
},
);
}
}
3.2. 代码说明
-
权限处理:结合
permission_handler插件申请相册权限,这是使用 Gal 的前提; -
图片加载:通过
Gal.getPhotos()获取相册图片,限制加载数量避免卡顿; -
图片展示:使用
GridView展示图片列表,点击图片调用Gal.preview()实现沉浸式预览; -
图片保存:调用
Gal.saveImage()将网络图片保存到自定义相册,保存成功后刷新列表。
3.3. 运行效果
- 首次打开应用会弹出权限申请弹窗,授权后加载相册前20张图片;
- 图片以网格形式展示,点击任意图片进入全屏预览模式,支持滑动切换、双指缩放;
- 点击右上角「保存」按钮,可将示例网络图片保存到「Gal Demo」相册,保存后列表自动刷新。
4. 注意事项
-
权限适配:
- Android 13+ 需单独申请
READ_MEDIA_IMAGES权限,Android 10 需配置android:requestLegacyExternalStorage="true"; - iOS 14+ 支持精确相册权限(仅允许选择部分图片),Gal 已适配该特性。
- Android 13+ 需单独申请
-
性能优化:
- 加载大量图片时,务必设置
limit参数分页加载,避免一次性加载全部图片导致内存溢出; - 预览图片时,建议使用
CachedNetworkImage缓存网络图片。
- 加载大量图片时,务必设置
-
异常处理:
- 所有 Gal API 均为异步操作,需添加
try/catch捕获权限拒绝、文件不存在等异常; - 保存网络图片时,需先判断网络状态,避免无网络时保存失败。
- 所有 Gal API 均为异步操作,需添加
5. 总结
- Gal 插件是 Flutter 中高效的图片管理工具,核心覆盖「权限申请、图片读取、预览、保存」四大核心场景,API 设计简洁且跨平台一致;
- 使用 Gal 的关键步骤:配置权限 → 申请权限 → 调用核心 API → 异常处理;
- 实战中需注意性能优化(分页加载、缓存)和平台适配(不同系统的权限/路径差异),确保体验一致性。
通过 Gal 插件,开发者可以摆脱原生图片处理的繁琐逻辑,快速实现媲美原生应用的图片交互体验,是 Flutter 图片类应用的优选插件。
源码:传送门
本次分享就到这儿啦,我是鹏多多,深耕前端的技术创作者,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~
PS:在本页按F12,在console中输入document.getElementsByClassName('panel-btn')[0].click();有惊喜哦~
往期文章
- flutter使用package_info_plus库获取应用信息的教程
- Flutter下拉刷新上拉加载侧拉刷新插件:easy_refresh全面使用指南
- flutter-使用EventBus实现组件间数据通信
- Flutter输入框TextField的属性与实战用法全面解析+示例
- Flutter自定义日历table_calendar完全指南+案例
- flutter-屏幕自适应插件flutter_screenutil教程全指南
- flutter-使用url_launcher打开链接/应用/短信/邮件和评分跳转等
- flutter图片选择库multi_image_picker_plus和image_picker的对比和使用解析
- 解锁flutter弹窗新姿势:dialog-flutter_smart_dialog插件解读+案例
- flutter-切换状态显示不同组件10种实现方案全解析
- flutter-详解控制组件显示的两种方式Offstage与Visibility
- flutter-使用AnimatedDefaultTextStyle实现文本动画
- flutter-使用SafeArea组件处理各机型的安全距离
- flutter-实现渐变色边框背景以及渐变色文字
- flutter-使用confetti制作炫酷纸屑爆炸粒子动画