菜单 · 组件

组件

生成二维码和条形码,不依赖相机。

Barcode

生成二维码和常见条形码。这是独立的 barcode feature,和相机扫码完全分开,也不需要相机权限。

三层 API

层 API 场景
纯函数 encode_barcode → BarcodeBitmap 批处理、单测、调用方自己的 worker
Hook use_barcode(contents, options) 内容变化自动重编码 + 异步导出
组件 Barcode { … } 声明式预览

线程模型(重要)

路径 线程
Barcode / use_barcode 编码 Tokio blocking pool(非 UI)
handle png_bytes_async / base64_png_async / save_png_async blocking pool,回调回 UI
纯函数 encode_barcode / to_png_bytes 同步,禁止在 UI 线程直接调用

UI 侧状态含 BarcodePhase::Encoding,用于占位,避免主线程卡住。

展示(默认)

编码结果优先转 SVG → ArkImageSource,与 icon 同一套 image 管线,无临时文件。

导出(按需,异步)

// UI:走 handle 异步 API
code.base64_png_async(|result| { /* UI 回调 */ });
code.save_png_async(path, |result| { /* … */ });

// 非 UI / 自管线程:
let bmp = encode_barcode(&BarcodeRequest::qr(url, 256))?;
let png = bmp.to_png_bytes()?;

组件

Barcode {
    contents: pay_url(),
    format: BarcodeFormat::QrCode,
    size: 220.0,
}
Prop 说明
contents 载荷
format 默认同 QR
size 矩阵边长 / 一维码宽度
height 一维码高度(可选)
options 覆盖 margin / 颜色 / EC 等
on_error 编码失败回调

Hook

let mut text = use_signal(|| "https://example.com".to_string());
let mut options = use_signal(|| BarcodeOptions::qr(256));
let code = use_barcode(text, options);

// code.image() → Option<ArkImageSource>
// code.phase() → Empty | Encoding | Ready | Error
// code.save_png_async(path, |result| { … });

格式

QrCode、DataMatrix、Aztec、Pdf417、Code128、Code93、Code39、Codabar、Ean13、Ean8、UpcA、UpcE、Itf。

与 CameraScanFormat 同构,便于「扫到再生成」手写映射。

与扫码的关系

barcode camera-scan
方向 生成 识别
依赖 rxing encoders CameraKit + rxing decoders
UI Barcode CameraView Scan 模式

示例

cd examples/barcode && ohrs build --arch aarch
./app/run.sh barcode all