@bingtang-rn/react-native-auto-height-image
v3.2.4
Published
适配鸿蒙版本,提供react_native_auto_height_image组件。
Maintainers
Readme
@bingtang-rn/react-native-auto-height-image for HarmonyOS
本项目基于 react-native-auto-height-image 开发,为 React Native 鸿蒙(OpenHarmony)适配版本。如果在使用过程中有任何问题,可以在GitCode提Issue,会及时跟进。issue地址:issues。
版本对应关系
| 鸿蒙适配包版本 | 原始库版本 | 支持 RN 版本 | Autolink | 编译 API 版本 | | ------------ | ---------- | ------------ | -------- | ------------- | | 见发布记录 | 3.2.4 | 0.72+ | 是 | API17+ |
安装
npm install @bingtang-rn/react-native-auto-height-image使用
import AutoHeightImage from 'react-native-auto-height-image';
import localImage from './assets/image.png';
const remoteSource = { uri: 'https://picsum.photos/id/1/350/150' };
const wrongSource = { uri: 'https://example.com/missing.png' };
// 远程图片自动高度
<AutoHeightImage
width={200}
source={remoteSource}
onHeightChange={(height) => console.log('height:', height)}
/>
// 本地图片
<AutoHeightImage width={200} source={localImage} />
// 错误回退 + 动画
<AutoHeightImage
width={200}
source={wrongSource}
fallbackSource={localImage}
animated={true}
onError={(e) => console.warn(e)}
/>import 时使用原库名
'react-native-auto-height-image',而非鸿蒙包名(由 RNOHharmony.alias自动重定向)。
平台差异:
- 本库为纯 JS 组件(js-only),无需手动 Link(无需 C++/ETS Package 注册),
npm install后通过harmony.alias自动重定向 import。 Image.resolveAssetSource、Image.getSize、Image.prefetch均由 RNOH 框架实现,鸿蒙端可用。ImagePolyfill的 Android 404 polyfill 在鸿蒙端不激活(Platform.OS === 'android'不命中);onError经Image.getSize失败路径触发,行为正确。
权限要求:
- 加载远程图片需在
module.json5声明ohos.permission.INTERNET(system_grant,安装时自动授予)。
Link
| 版本 | 是否支持 Autolink | |------|------------------| | 当前版本 | 是 |
如使用版本支持 Autolink 且工程已接入,可跳过手动配置。
说明:本模块需要同时在 C++ 侧和 ETS 侧注册 Package。
1. Overrides RN SDK
在工程根目录 oh-package.json5 添加:
{
"overrides": {
"@rnoh/react-native-openharmony": "./react_native_openharmony"
}
}2. 引入原生端依赖
打开 entry/oh-package.json5,添加:
"dependencies": {
"@bingtang-rn/react-native-auto-height-image": "file:../../node_modules/@bingtang-rn/react-native-auto-height-image/harmony/auto_height_image.har"
}执行 ohpm install。
3. 配置 CMakeLists
打开 entry/src/main/cpp/CMakeLists.txt,添加:
set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
add_subdirectory("${OH_MODULES}/@bingtang-rn/react-native-auto-height-image/src/main/cpp" ./auto_height_image)
target_link_libraries(rnoh_app PUBLIC auto_height_image)4. 注册 Package(C++ 侧)
打开 entry/src/main/cpp/PackageProvider.cpp,添加:
#include "AutoHeightImagePackage.h"
std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
return {
std::make_shared<AutoHeightImagePackage>(ctx),
};
}5. 注册 Package(ETS 侧)
打开 entry/src/main/ets/RNPackagesFactory.ets,添加:
import { AutoHeightImagePackage } from '@bingtang-rn/react-native-auto-height-image/ts';
export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
return [
new AutoHeightImagePackage(ctx),
];
}属性 / API
| API | 描述 | 参数 | 返回值 | HarmonyOS 支持 | |-----|------|------|--------|----------------| | source | 图片源(本地 require id 或远程 uri) | number | { uri: string } | — | ✅ 完全支持 | | width | 目标宽度,据此等比计算高度 | number | — | ✅ 完全支持 | | maxHeight | 高度上限,超过截断 | number(默认 Infinity) | — | ✅ 完全支持 | | fallbackSource | 主源加载失败时的回退源 | number | { uri: string } | — | ✅ 完全支持 | | onHeightChange | 高度变化回调(height 可能为 0) | (height: number) => void | — | ✅ 完全支持 | | animated | 为 true 时底层用 Animated.Image | boolean(默认 false) | — | ✅ 完全支持 | | children | 有子元素时底层用 ImageBackground | ReactNode | — | ✅ 完全支持 | | onError | 图片加载错误回调 | (e: NativeSyntheticEvent) => void | — | ✅ 完全支持 | | ...ImageProps | 继承 RN Image 其余 props(除 resizeMode) | ImageProps | — | ✅ 完全支持 |
平台差异
ImagePolyfill(Android 404 prefetch polyfill)在鸿蒙端不激活;RNOH Image 的onError对远程图片失败(含 404)正常触发,onError经Image.getSize失败路径到达回调,行为正确。- 原库深路径 import
react-native/Libraries/Image/resolveAssetSource已改为公开 APIImage.resolveAssetSource(RNOH 已实现,返回{ width, height, uri })。 - RN 0.72+ 已移除
Image.propTypes,适配代码已移除相关 propTypes 声明(React 17+ 不再校验 propTypes,行为等价)。
使用限制
- 加载远程图片需声明
ohos.permission.INTERNET。 source为number时走Image.resolveAssetSource(本地资源);为{ uri }时走Image.getSize(远程图片)。
快速验证(运行 Example)
前置条件
| 依赖 | 版本要求 | |------|----------| | Node.js | >= 18 | | DevEco Studio | 5.0+ / 6.0+ | | HarmonyOS SDK | API 17+ |
运行步骤
1. 克隆仓库
git clone <仓库地址>
cd <仓库目录>2. 安装依赖并构建
npm install --legacy-peer-deps
npm pack # 生成 tgz 包(会自动触发 prepare 构建 JS 产物)3. 进入 example 目录,安装依赖
cd example
npm install --legacy-peer-deps4. 生成 JS Bundle
npm run dev产物:harmony/entry/src/main/resources/rawfile/bundle.harmony.js
5. 用 DevEco Studio 打开鸿蒙工程
- 打开 DevEco Studio
- 选择
example/harmony目录 - 等待 Sync 完成
6. 编译并运行 HAP
在 DevEco Studio 中点击运行按钮,将 HAP 安装到设备/模拟器。
注意:Example 中已预置插件依赖和 Package 注册,无需手动配置 Link。
约束与限制
兼容性
- RNOH: 0.72+
- HarmonyOS SDK: API 17+
- DevEco Studio: 5.0+
遗留问题
无(或列出已知问题)
开源协议
本项目基于 MIT License,详见 LICENSE 文件。
