菜单 · 组件

最后更新:2026年8月12日

组件

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

Barcode

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

三层 API

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

线程模型(重要)

路径线程
Barcode / use_barcode 编码Tokio blocking pool(非 UI)
handle png_bytes_async / base64_png_async / save_png_asyncblocking 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| { … });

格式

QrCodeDataMatrixAztecPdf417Code128Code93Code39CodabarEan13Ean8UpcAUpcEItf

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

与扫码的关系

barcodecamera-scan
方向生成识别
依赖rxing encodersCameraKit + rxing decoders
UIBarcodeCameraView Scan 模式

示例

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