普通视图

发现新文章,点击刷新页面。
今天 — 2026年1月26日首页

被蚂蚁、移动投资,这家机器人公司说:“2026年交付必有一战”

2026年1月26日 20:40

文|富充

编辑|苏建勋

“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%股权

2026年1月26日 20:38
36氪获悉,九鼎新材公告,公司全资子公司甘肃九鼎为加快推进“大型兆瓦级风电叶片生产线项目”建设,与公司控股股东九鼎集团于2026年1月26日签署了《股权转让合同》,经双方协商确定,以2025年12月31日为评估基准日的股东全部权益价值3950.14万元为定价依据收购九鼎集团持有的九鼎新能源100%股权。本次收购事项完成后,九鼎新能源成为甘肃九鼎的全资子公司,纳入公司合并报表范围。本次交易旨在通过股权收购的方式获取九鼎新能源现有的土地和厂房资产,以加快大型兆瓦级风电叶片生产线项目的建设进度,节省新建厂房的时间与资金成本。

开普检测:董事长拟减持公司不超3%股份

2026年1月26日 20:36
36氪获悉,开普检测公告,持股15.77%的股东、董事长姚致清计划以集中竞价或大宗交易方式合计减持公司股份不超过312万股(即不超过公司总股本的3%);公司副总经理宋霞计划以集中竞价方式减持公司股份不超过22.4万股(占公司总股本比例0.2154%)。

中国人民银行召开2026年宏观审慎工作会议

2026年1月26日 20:13
36氪获悉,1月22日,中国人民银行召开2026年宏观审慎工作会议。会议要求,2026年宏观审慎工作要继续按照构建覆盖全面的宏观审慎管理体系部署,强化中央银行宏观审慎管理功能,持续完善宏观审慎和金融稳定委员会工作机制,逐步拓展宏观审慎政策覆盖范围,前瞻性研判系统性金融风险隐患,创新丰富政策工具箱,维护金融市场稳健运行和金融体系整体稳定。以服务构建新发展格局为导向,进一步完善人民币跨境使用政策,促进货物贸易便利化,优化人民币清算行布局,更好发挥货币互换作用,发展人民币离岸市场,支持上海国际金融中心建设,更好满足各类主体人民币交易结算、投融资、风险管理等需求。

我尝试将TinyPro集成TinyEngine低代码设计器了

2026年1月26日 19:57

TinyProTinyEngine 是 OpenTiny 开源生态的重要组成部分:

  • TinyPro 提供企业级后台系统模板
  • TinyEngine 提供灵活强大的低代码引擎

本项目在 TinyPro 中深度集成了基于 TinyEngine 的低代码设计器,通过 插件化架构 构建出可扩展的低代码开发平台。

借助它,你只需在可视化设计器中完成页面设计,就能一键导入 TinyPro,并自动生成菜单、权限及国际化配置,实现真正的 “所见即所得” 式开发体验。

整体架构

lowcode-designer/
├── src/
│   ├── main.js              # 应用入口
│   ├── composable/          # 可组合逻辑
│   ├── configurators/       # 配置器
├── registry.js              # 插件注册表
├── engine.config.js         # 引擎配置
└── vite.config.js          # 构建配置

image.png

核心组成部分

  1. TinyEngine 核心:提供低代码设计器的基础能力
  2. 插件系统:通过插件扩展功能
  3. 注册表机制:统一管理插件和服务
  4. 配置器系统:自定义组件属性配置

核心特性

  • 智能代码生成:基于可视化设计自动生成符合 TinyPro 规范的 Vue 3 + TypeScript 代码
  • 🔐 自动认证管理:智能获取和管理 API Token,支持多种认证方式
  • 🎯 一键集成:自动创建菜单、配置权限、添加国际化词条
  • 🛠️ 代码转换:将 TinyEngine 生成的代码自动转换为 TinyPro 项目兼容格式
  • 💾 本地保存:支持将生成的文件保存到本地文件系统
  • 🎨 可视化配置:提供友好的 UI 界面进行菜单和路由配置

快速开始

安装

使用 TinyCli 可以快速初始化 TinyPro 模版

tiny init pro 

image 1.png

启动低代码设计器

cd lowcode-designer
pnpm install
pnpm dev

启动前端与后端

cd web
pnpm install
pnpm start

cd nestJs
pnpm install
pnpm start

启动完成后,访问 👉 http://localhost:8090 即可体验低代码设计器。

使用流程

image 2.png

设计页面:在 TinyEngine 可视化编辑器中设计页面

image 3.png

点击出码按钮:点击工具栏中的”出码”按钮

image 4.png

配置菜单信息:在弹出的对话框中填写菜单配置信息

生成预览:点击”生成预览”查看将要生成的文件

image 5.png

完成集成:点击”完成集成”自动创建菜单、分配权限并保存文件

image 6.png

接下来我们就可以直接去 TinyPro 直接看到页面效果

image 7.png

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 系统。

image 8.png

总结

通过 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 标签,一起参与开源贡献~

Flutter-使用Gal展示和保存图片资源

作者 鹏多多
2026年1月26日 19:51

Gal 是 Flutter 生态中一款轻量、高性能的图片管理与预览插件,专为简化 Flutter 应用中图片选择、预览、保存等核心场景设计。它封装了原生平台的图片处理能力,提供统一的 API 接口,让开发者无需关注 iOS/Android 底层差异,快速实现专业级的图片交互体验。

1. Gal 插件核心功能

Gal 插件的核心价值在于跨平台一致性易用性,主要覆盖以下场景:

  1. 图片预览:支持单张/多张图片的沉浸式预览,包含缩放、滑动切换、手势返回等交互;
  2. 相册操作:读取设备相册、筛选图片/视频、获取图片元信息(尺寸、路径、创建时间);
  3. 图片保存:将网络图片/本地图片保存到系统相册,自动处理权限申请;
  4. 权限管理:封装相册读写权限的申请与状态检测,适配 iOS/Android 权限机制差异;
  5. 性能优化:内置图片懒加载、内存缓存策略,避免大图集加载时的卡顿问题。

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: 图片本地路径/网络 URL
albumName: 自定义相册名称(可选)
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, // 每行3crossAxisSpacing: 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. 代码说明

  1. 权限处理:结合 permission_handler 插件申请相册权限,这是使用 Gal 的前提;
  2. 图片加载:通过 Gal.getPhotos() 获取相册图片,限制加载数量避免卡顿;
  3. 图片展示:使用 GridView 展示图片列表,点击图片调用 Gal.preview() 实现沉浸式预览;
  4. 图片保存:调用 Gal.saveImage() 将网络图片保存到自定义相册,保存成功后刷新列表。

3.3. 运行效果

  1. 首次打开应用会弹出权限申请弹窗,授权后加载相册前20张图片;
  2. 图片以网格形式展示,点击任意图片进入全屏预览模式,支持滑动切换、双指缩放;
  3. 点击右上角「保存」按钮,可将示例网络图片保存到「Gal Demo」相册,保存后列表自动刷新。

4. 注意事项

  1. 权限适配

    1. Android 13+ 需单独申请 READ_MEDIA_IMAGES 权限,Android 10 需配置 android:requestLegacyExternalStorage="true"
    2. iOS 14+ 支持精确相册权限(仅允许选择部分图片),Gal 已适配该特性。
  2. 性能优化

    1. 加载大量图片时,务必设置 limit 参数分页加载,避免一次性加载全部图片导致内存溢出;
    2. 预览图片时,建议使用 CachedNetworkImage 缓存网络图片。
  3. 异常处理

    1. 所有 Gal API 均为异步操作,需添加 try/catch 捕获权限拒绝、文件不存在等异常;
    2. 保存网络图片时,需先判断网络状态,避免无网络时保存失败。

5. 总结

  1. Gal 插件是 Flutter 中高效的图片管理工具,核心覆盖「权限申请、图片读取、预览、保存」四大核心场景,API 设计简洁且跨平台一致;
  2. 使用 Gal 的关键步骤:配置权限 → 申请权限 → 调用核心 API → 异常处理;
  3. 实战中需注意性能优化(分页加载、缓存)和平台适配(不同系统的权限/路径差异),确保体验一致性。

通过 Gal 插件,开发者可以摆脱原生图片处理的繁琐逻辑,快速实现媲美原生应用的图片交互体验,是 Flutter 图片类应用的优选插件。

源码:传送门


本次分享就到这儿啦,我是鹏多多,深耕前端的技术创作者,如果您看了觉得有帮助,欢迎评论,关注,点赞,转发,我们下次见~

PS:在本页按F12,在console中输入document.getElementsByClassName('panel-btn')[0].click();有惊喜哦~

往期文章

三维通信:共同设立私募股权基金,聚焦航空航天等行业的非上市股权

2026年1月26日 19:48
36氪获悉,三维通信公告,公司与杭州九智投资管理有限公司等5位合伙人签署合伙协议,共同投资杭州渠智股权投资合伙企业(有限合伙),渠智基金总认缴出资额为人民币1.14亿元,公司作为基金的有限合伙人以自有资金认缴出资2500万元。本合伙基金可投资于智能制造、航空航天、新能源等高新技术行业的非上市股权,并可以通过投资或受让资产管理产品份额或合伙企业的有限合伙份额间接投资非上市股权标的。
❌
❌