auto-fill 基于 HarmonyOS autoFillManager 模块,提供将表单输入数据保存到历史表单输入中,以供下次自动填充的功能,仅支持 ohos 平台。
主要目录结构如下:
auto-fill
├── assets # README静态资源
├── LICENSE
├── README.md
├── package.json
├── auto-fill # 源码包
│ ├── harmony # native 源码
│ ├── index.ts
│ ├── package.json
│ └── src
└── tester # 使用了 auto-fill 的 react-native 示例工程
TextInput
组件传入 textContentType
属性。请到三方库的 Releases 发布地址查看配套的版本信息:@react-native-ohos-community/auto-fill Releases,并下载适用版本的 tgz 包。
进入到 react-native 工程目录安装 tgz 包:
npm install @react-native-ohos-community/auto-fill@file:path/to/tgz
yarn add @react-native-ohos-community/auto-fill@file::path/to/tgz
auto-fill 仅暴露一个 autoSave 接口,用于保存当前表单信息
API | 说明 | 入参 | 返回值 |
---|---|---|---|
autoSave(onSuccess?, onFailure?) | 保存当前表单信息 | (onSuccess?: () => void, onFailure?: () => void) | void |
autoSave 方法在 native 侧限制 2s 内只能调用一次,多次调用将触发 onFailure 方法,并输出
autoSave called too frequently, please wait for 2 seconds.
import React, { useState } from "react";
import { View, TextInput, Button, StyleSheet } from "react-native";
import AutoFill from "@react-native-ohos-community/auto-fill";
const MyFormComponent = () => {
const [fullName, setFullName] = useState("");
const [phoneNumber, setPhoneNumber] = useState("");
const handleSubmit = () => {
AutoFill.autoSave(
() => {
console.log("AutoFillTurboModule success in js is been called");
},
() => {
console.log("AutoFillTurboModule failed in js is been called");
}
);
};
return (
<View style={styles.container}>
<TextInput
style={styles.input}
placeholder="Full Name"
value={fullName}
onChangeText={setFullName}
autoCapitalize="words"
textContentType="name"
/>
<TextInput
style={styles.input}
placeholder="Phone Number"
value={phoneNumber}
onChangeText={setPhoneNumber}
keyboardType="phone-pad"
textContentType="telephoneNumber"
/>
<Button title="Submit" onPress={handleSubmit} />
</View>
);
};
export default MyFormComponent;
初次调用 AutoFill.autoSave
将弹出“保存至历史表单输入”半模态窗。
适用于如购票信息、收货信息等联系人数据相关表单,示例代码可查看 ContactsComponent.tsx
适用于如登录界面相关表单,示例代码可查看 PasswordComponent.tsx
具体密码保存与填充规则请参考:密码自动填充服务
React-Native 侧 TextInput 组件接收的 textContentType 类型与 HarmonyOS 中 ContentType 类型映射关系如下,可供参考。
// key 值为 RN 侧 textContentType 值,
// value 值为 HarmonyOS 侧 ContentType 值
{
"addressCity": CITY_ADDRESS, // 市
"addressState": PROVINCE_ADDRESS, // 省
"countryName": COUNTRY_ADDRESS, // 国家
"creditCardNumber": BANK_CARD_NUMBER, // 银行卡号
"fullStreetAddress": FULL_STREET_ADDRESS, // 详细地址
"sublocality": DISTRICT_ADDRESS, // 区/县
"telephoneNumber": PHONE_NUMBER, // 手机号码
"username": USER_NAME, // 用户名
"password": PASSWORD, // 密码
"newPassword": NEW_PASSWORD, // 新密码
"houseNumber": HOUSE_NUMBER, // 门牌号
"districtAddress": DISTRICT_ADDRESS, // 区/县
"cityAddress": CITY_ADDRESS, // 市
"provinceAddress": PROVINCE_ADDRESS, // 省
"countryAddress": COUNTRY_ADDRESS, // 国家
"personFullName": PERSON_FULL_NAME, // 姓名
"personLastName": PERSON_LAST_NAME, // 姓氏
"personFirstName": PERSON_FIRST_NAME, // 名字
"phoneNumber": PHONE_NUMBER, // 手机号码
"phoneCountryCode": PHONE_COUNTRY_CODE, // 国家代码
"fullPhoneNumber": FULL_PHONE_NUMBER, // 包含国家代码的手机号码
"emailAddress": EMAIL_ADDRESS, // 邮箱地址
"bankCardNumber": BANK_CARD_NUMBER, // 银行卡号
"idCardNumber": ID_CARD_NUMBER, // 身份证号
"nickName": NICKNAME, // 昵称
"name": PERSON_FULL_NAME, // 姓名
"familyName": PERSON_LAST_NAME, // 姓氏
"givenName": PERSON_FIRST_NAME, // 名字
"detailInfoWithoutStreet": DETAIL_INFO_WITHOUT_STREET,// 无街道地址
"formatAddress": FORMAT_ADDRESS, // 标准地址
}
目前 HarmonyOS 暂不支持 AutoLink,所以 Link 步骤需要手动配置。
首先需要使用 DevEco Studio 打开项目里的 HarmonyOS 工程 harmony
oh-package.json5
添加 overrides 字段{
"overrides": {
"@rnoh/react-native-openharmony" : "./react_native_openharmony"
}
}
目前有两种方法:
方法 1:通过 har 包引入(推荐)
[!TIP] har 包位于三方库安装路径的
harmony
文件夹下。
打开 entry/oh-package.json5
,添加以下依赖
"dependencies": {
"@rnoh/react-native-openharmony": "file:../react_native_openharmony",
"@react-native-ohos-community/auto-fill": "file:../../node_modules/@react-native-ohos-community/auto-fill/harmony/auto_fill.har"
}
点击右上角的 sync
按钮
或者在终端执行:
cd entry
ohpm install
方法 2:直接链接源码
如需使用直接链接源码,请参考直接链接源码说明
打开 entry/src/main/cpp/CMakeLists.txt
,添加:
project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
...
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp")
set(LOG_VERBOSITY_LEVEL 1)
# RNOH_BEGIN: manual_package_linking_1
+ add_subdirectory("${OH_MODULES}/@react-native-ohos-community/auto-fill/src/main/cpp" ./auto-fill)
# RNOH_END: manual_package_linking_1
add_library(rnoh_app SHARED
${GENERATED_CPP_FILES}
"./PackageProvider.cpp"
"${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
# RNOH_BEGIN: manual_package_linking_2
+ target_link_libraries(rnoh_app PUBLIC auto_fill)
# RNOH_END: manual_package_linking_2
打开 entry/src/main/cpp/PackageProvider.cpp
,添加:
#include "RNOH/PackageProvider.h"
+ #include "AutoFillPackage.h"
using namespace rnoh;
std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(
Package::Context ctx) {
return {
+ std::make_shared<AutoFillPackage>(ctx),
};
}
打开 entry/src/main/ets/RNPackagesFactory.ts
,添加:
...
+ import { AutoFillPackage } from '@react-native-ohos-community/auto-fill/ts'
export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
return [
+ new AutoFillPackage(ctx),
];
}
本项目基于 The MIT License (MIT) ,请自由地享受和参与开源。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。