rntpc_react-native-SmartRefreshLayout:基于 react-native-SmartRefreshLayout 的 OpenHarmony 适配版,下拉刷新与上拉加载更多组件

基于 react-native-SmartRefreshLayout 的 OpenHarmony 适配版,下拉刷新与上拉加载更多组件

Branch4Tags5
FilesLast commitLast update
5 days ago
8 days ago
1 month ago
9 months ago
5 days ago
1 month ago
8 days ago
2 months ago
8 days ago
9 months ago
8 days ago
8 days ago
1 month ago
8 days ago
1 month ago

文档模板:v0.4.2

react-native-smartrefreshlayout

本项目基于 react-native-smartrefreshlayout 开发。

该第三方库的仓库已迁移至 Gitcode,并支持直接从 npm 下载,新的包名为:@react-native-ohos/react-native-smartrefreshlayout。各版本归属关系如下:

第三方库名称 第三方库版本(npm 地址) 发布信息 支持的 RN 版本 Autolink 编译 API 版本 社区基线版本 源码地址
@react-native-ohos/react-native-smartrefreshlayout ~ 0.8.1(进行中) Gitcode 发布 0.82.* / 0.84.* API12+ 0.6.7 master
@react-native-ohos/react-native-smartrefreshlayout ~ 0.7.1 Gitcode 发布 0.77.* API12+ 0.6.7 br_rnoh0.77
@react-native-ohos/react-native-smartrefreshlayout ~ 0.6.9 Gitcode 发布 0.72.* API12+ 0.6.7 br_rnoh0.72
@react-native-oh-tpl/react-native-smartrefreshlayout <= 0.6.7-0.2.18(已弃用) Github 发布(已弃用) 0.72.* API12+ 0.6.7 sig

简介

react-native-smartrefreshlayout 是一款基于 Android SmartRefreshLayout 封装的下拉刷新组件库,提供 SmartRefreshControl、AnyHeader、DefaultHeader、ClassicsHeader、StoreHouseHeader 等多种刷新头部组件,支持下拉刷新、自动刷新、越界拖动等丰富的刷新特性与回调事件。

下载安装

进入工程目录,并执行以下命令:

npm

npm install @react-native-ohos/react-native-smartrefreshlayout

yarn

yarn add @react-native-ohos/react-native-smartrefreshlayout

链接

是否支持 autolink RN 框架版本
~ 0.8.1 0.82、0.84

使用 AutoLink 的工程需根据本文档进行配置,Autolink 框架指导文档:https://gitcode.com/CPF-RN/ohos_react_native/blob/master/docs/zh-cn/Autolinking.md

如果当前使用的版本支持 Autolink,并且工程已接入 Autolink,则可以跳过 ManualLink 配置。

ManualLink:此步骤为手动配置原生依赖项的指导

首先需要使用 DevEco Studio 打开项目中的 HarmonyOS 工程 harmony

1. 覆盖 RN SDK

为了让工程依赖同一版本的 RN SDK,需要在工程根目录的 oh-package.json5 中添加 overrides 字段,指向工程需要使用的 RN SDK 版本。被覆盖的版本既可以是具体版本号,也可以是版本范围,还可以是本地已有的 HAR 包或源码目录。

关于该字段的作用,请阅读官方说明

{
  "overrides": {
    "@rnoh/react-native-openharmony": "^0.84.1" // ohpm 在线版本
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony.har" // 指向本地 har 包的路径
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony" // 指向源码路径
  }
}

2. 引入原生端代码

当前支持两种引入方式:

  • 通过 har 包引入;
  • 直接链接源码。

方法一:通过 har 包引入(推荐)

har 包位于第三方库安装路径下的 `harmony` 文件夹中。

打开 entry/oh-package.json5,添加以下依赖

"dependencies": {
    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
    "@react-native-ohos/react-native-smartrefreshlayout": "file:../../node_modules/@react-native-ohos/react-native-smartrefreshlayout/harmony/smart_refresh_layout.har"
  }

点击右上角的 sync 按钮

或在命令行终端中执行:

cd entry
ohpm install

方法二:直接链接源码

如需使用直接链接源码,请参考[直接链接源码说明](https://gitcode.com/CPF-RN/usage-docs/blob/master/zh-cn/link-source-code.md)

3. 配置 CMakeLists 和引入 SmartRefreshLayoutPackage

打开 entry/src/main/cpp/CMakeLists.txt,添加:

project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules")
+ 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)
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie")
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
add_compile_definitions(WITH_HITRACE_SYSTRACE)

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

# RNOH_BEGIN: manual_package_linking_1
add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package)
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-smartrefreshlayout/src/main/cpp" ./smart-refresh-layout)
# RNOH_END: manual_package_linking_1

file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")

add_library(rnoh_app SHARED
    ${GENERATED_CPP_FILES}
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
target_link_libraries(rnoh_app PUBLIC rnoh)

# RNOH_BEGIN: manual_package_linking_2
target_link_libraries(rnoh_app PUBLIC rnoh_sample_package)
+ target_link_libraries(rnoh_app PUBLIC rnoh_smart_refresh_layout)
# RNOH_END: manual_package_linking_2

打开 entry/src/main/cpp/PackageProvider.cpp,添加:

#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
#include "SamplePackage.h"
+ #include "SmartRefreshLayoutPackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
        std::make_shared<RNOHGeneratedPackage>(ctx),
        std::make_shared<SamplePackage>(ctx),
+       std::make_shared<SmartRefreshLayoutPackage>(ctx),
    };
}

4. 在 ArkTs 侧引入 SmartRefreshPackage

打开 entry/src/main/ets/RNPackagesFactory.ts,添加:

  ...
+ import { SmartRefreshPackage } from '@react-native-ohos/react-native-smartrefreshlayout/ts';

export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new SamplePackage(ctx),
+   new SmartRefreshPackage(ctx)
  ];
}

运行

点击右上角的 sync 按钮

或者在命令行终端执行:

cd entry
ohpm install

随后,编译并运行即可。

约束与限制

兼容性

本文档内容已在以下版本中验证通过:

  1. RNOH:0.84.1;SDK:HarmonyOS 6.1.0 Release SDK;IDE:DevEco Studio 6.1.0.830;ROM:6.0.0.130;

权限要求

使用示例

以下代码展示了该库的基本使用场景:

使用时,import 的库名保持不变。

import React, { useState } from "react";
import {
  View,
  Text,
  FlatList,
  StyleSheet,
  TouchableOpacity,
} from "react-native";
import {
  SmartRefreshControl,
  AnyHeader,
} from "react-native-smartrefreshlayout";

const App = () => {
  const [text, setText] = useState("状态");
  const [text1, setText1] = useState("刷新时间");

  const [headerHeight, setHeaderHeight] = useState(66);
  const [color, setColor] = useState("#fff000");

  const [data, setData] = useState([
    { id: 1, text: "Item 1" },
    { id: 2, text: "Item 2" },
    { id: 3, text: "Item 3" },
    { id: 4, text: "Item 4" },
    { id: 5, text: "Item 5" },
    { id: 6, text: "Item 6" },
    { id: 7, text: "Item 7" },
    { id: 8, text: "Item 8" },
    { id: 9, text: "Item 9" },
    { id: 10, text: "Item 10" },
    { id: 11, text: "Item 11" },

    // ... more data ...
  ]);

  const renderItem = ({ item }) => (
    <View style={styles.item}>
      <Text style={styles.item}>{item.text}</Text>
    </View>
  );
  let smartRefreshControlRef: React.RefObject<SmartRefreshControl>;
  return (
    <View>
      <TouchableOpacity
        onPress={() => {
          smartRefreshControlRef.finishRefresh({ delayed: -1, success: true });
        }}
      >
        <Text style={{ height: 40, width: "100%", backgroundColor: "red" }}>
          finish
        </Text>
      </TouchableOpacity>

      <TouchableOpacity
        onPress={() => {
          setHeaderHeight(headerHeight == 66 ? 132 : 66);
        }}
      >
        <Text style={{ height: 40, width: "100%", backgroundColor: "pink" }}>
          切换高度 66/132
        </Text>
      </TouchableOpacity>

      <TouchableOpacity
        onPress={() => {
          setColor(color === "#fff000" ? "red" : "#fff000");
        }}
      >
        <Text style={{ height: 40, width: "100%", backgroundColor: "green" }}>
          切换颜色(正在刷新中不支持切换背景色)
        </Text>
      </TouchableOpacity>

      <Text style={{ height: 40, width: "100%", backgroundColor: "" }}>
        {text}
      </Text>
      <Text style={{ height: 40, width: "100%", backgroundColor: "" }}>
        {text1}
      </Text>
      <SmartRefreshControl
        ref={(ref) => (smartRefreshControlRef = ref)}
        primaryColor={color}
        headerHeight={headerHeight}
        style={{ height: 500, width: "100%", backgroundColor: "#ffcc00" }}
        onHeaderMoving={(e) => {
          setText("onHeaderMoving" + JSON.stringify(e.nativeEvent));
        }}
        onRefresh={() => {
          setText1("时间:" + new Date().getTime() + "onRefresh触发刷新");
        }}
        HeaderComponent={
          <AnyHeader style = {{ height: 0 }}>
            <Text style={{ height: 66, width: "100%" }}>{text}</Text>
          </AnyHeader>
        }
      >
        <FlatList
          style={{ flex: 1, height: "100%", width: "100%" }}
          bounces={false}
          data={data}
          renderItem={renderItem}
          keyExtractor={(item) => item.id.toString()}
        />
      </SmartRefreshControl>
    </View>
  );
};

const styles = StyleSheet.create({
  item: {
    padding: 16,
    borderBottomWidth: 1,
    borderBottomColor: "#ccc",
    width: 100,
    height: 100,
  },
});

export default App;

接口说明

"Platform" 列表示该属性在原有第三方库中支持的平台。

"HarmonyOS Support" 列中,yes 表示 HarmonyOS 平台支持该属性;no 表示不支持;partially 表示部分支持。跨平台使用方法一致,效果对标 iOS 或 Android。

属性

SmartRefreshControl

名称 参数类型 默认值 必填 平台 HarmonyOS 支持 说明
HeaderComponent Element DefaultHeader No Android Yes 用于渲染 SmartRefreshLayout 组件的 Header
renderHeader Element/func DefaultHeader No Android Yes 用于渲染 SmartRefreshLayout 组件的 Header
enableRefresh boolean true No Android Yes 是否启用下拉刷新
headerHeight number 0 No Android Yes 设置 Header 的高度
primaryColor string none No Android Yes 设置刷新组件的主色
autoRefresh object:{refresh?:boolean, time?:number} none No Android Yes 是否自动刷新
pureScroll boolean false No Android No 是否启用纯滚动
overScrollBounce boolean true No Android No 是否启用越界回弹
overScrollDrag boolean true No Android No 是否启用越界拖动,类似 iOS 样式
dragRate number 0.5 No Android Yes 设置组件下拉高度与手指实际下拉高度的比值
maxDragRate number 2.0 No Android Yes 设置最大下拉显示高度与 Header 标准高度的比值
onLoadMore function none No Android No 上拉加载回调
onPullDownToRefresh function none No Android Yes 可下拉刷新时触发
onReleaseToRefresh function none No Android Yes 可释放刷新时触发
onRefresh function none No Android Yes 刷新时触发
onHeaderPulling ({nativeEvent: {percent:number, offset:number, headerHeight:number}})=>void none No Android Yes Header 下拉过程中触发
onHeaderReleasing ({nativeEvent: {percent:number, offset:number, headerHeight:number}})=>void none No Android Yes Header 释放过程中触发
onHeaderReleased function none No Android Yes Header 释放时触发
onHeaderMoving ({nativeEvent: {percent:number, offset:number, headerHeight:number}})=>void none No Android Yes Header 移动过程中触发,包含下拉与释放过程

组件 AnyHeader

当前组件支持

名称 参数类型 默认值 必填 平台 HarmonyOS 支持 说明
primaryColor string none No Android Yes 刷新组件 Header 的主色

组件 DefaultHeader/ClassicsHeader

当前组件支持

名称 参数类型 默认值 必填 平台 HarmonyOS 支持 说明
primaryColor string none No Android Yes 刷新组件 Header 的主色
accentColor string none No Android Yes 刷新组件 Header 的强调色

组件 StoreHouseHeader

当前组件支持

名称 参数类型 默认值 必填 平台 HarmonyOS 支持 说明
text string StoreHouse No Android Yes StoreHouseHeader 的文本(暂仅支持英文)
textColor string #cccccc No Android Yes StoreHouseHeader 的文本颜色
fontSize number 25 No Android Yes StoreHouseHeader 的文本字号
lineWidth number 1 No Android Yes StoreHouseHeader 的文本线宽
dropHeight number 40 No Android Yes StoreHouseHeader 的下拉高度

组件 MeaterialHeader

当前组件支持

无自有属性(仅继承 ViewProps)。该组件为 HarmonyOS 侧额外导出,上游 index.js 未导出 MaterialHeader。

API

名称 类型 参数类型 返回值 必填 平台 HarmonyOS平台支持 描述
SmartRefreshControl.finishRefresh function params: {delayed?:number, success?:boolean} void Android 完成刷新。delayed 为延迟时间(毫秒,-1 表示立即执行),success 表示是否刷新成功

遗留问题

其他

目录结构

/rntpc_react-native-SmartRefreshLayout  # 项目根目录
├── harmony                      # 鸿蒙适配代码
│    └─ smart_refresh_layout.har # har包
│    └─ smart_refresh_layout     # 鸿蒙适配核心代码
│          └─ index.ets          # 鸿蒙适配代码入口    
│          └─ ts.ets             # ArkTS侧导出
│          └─ src/main/cpp       # C++ 适配代码
│          └─ src/main/ets       # ArkTS 适配代码
├── src                          # RN代码
│    └─ index.tsx                # 入口文件
│    └─ SmartRefreshControl.tsx  # SmartRefreshControl 组件实现
│    └─ AnyHeader.tsx            # AnyHeader 组件实现
│    └─ fabric                   # Fabric 组件类型定义
├── README_en.md                 # 英文安装使用方法    
├── README.md                    # 中文安装使用方法                    

贡献代码

在使用过程中如发现任何问题,均可提交 Issue,同时也欢迎提交 PR

开源协议

本项目基于 Apache License 2.0 ,欢迎大家自由使用并积极参与开源。

Introduction

基于 react-native-SmartRefreshLayout 的 OpenHarmony 适配版,下拉刷新与上拉加载更多组件

Customize your domain