一、前言

      在 RN + 开源鸿蒙跨平台开发的 Day11-12 阶段,核心聚焦 “收藏功能状态丢失” 的问题解决 ,通过接入鸿蒙适配版react-native-async-storage三方库,实现收藏状态的本地持久化;同时结合开源鸿蒙的工程特性,完成功能与终端的适配验证。本文贴合发文要求,重点分享问题排查、三方库适配、状态持久化的技术思路,避免纯流程性内容。

二、核心开发背景:收藏状态丢失的痛点

      在前期开发中,食谱列表的 “收藏” 功能仅通过页面状态临时存储,切换页面后状态会被重置 —— 这是 RN 跨平台开发中 “内存态数据未持久化”的典型问题。需通过本地缓存工具 (鸿蒙适配的三方库)实现数据的持久化存储,同时解决 “三方库与鸿蒙 SDK 版本兼容” 的问题。

三、技术实现:三方库适配与状态持久化

3.1 鸿蒙适配版react-native-async-storage接入

3.1.1 核心适配问题

普通 RN 版本的react-native-async-storage未适配鸿蒙 SDK,直接安装会出现 “编译失败”、“模块找不到” 的问题。因此需选择开源鸿蒙已兼容的三方库版本,并同步配置工程依赖。

3.1.2 接入关键步骤
  1. 版本选择:选用开源鸿蒙兼容清单中推荐的react-native-async-storage@1.21.0(已完成鸿蒙适配);
  2. 工程同步:安装后更新鸿蒙工程的oh-package.json5,将库添加至dependencies节点,确保鸿蒙编译工具识别依赖;
  3. 权限适配:无需额外权限(本地缓存属于应用沙箱内操作),但需确保工程已声明网络权限(不影响本地存储功能)。

3.2 收藏状态持久化的核心逻辑

通过 “本地缓存读写 + 页面状态联动”,实现收藏状态的持久化与自动恢复,核心代码逻辑如下:

3.2.1 封装AsyncStorage工具类
// utils/storage.js
import AsyncStorage from '@react-native-async-storage/async-storage';

// 收藏数据的Key
const FAVORITE_KEY = 'recipe_favorites';

// 读取所有收藏数据
export const getFavorites = async () => {
  const data = await AsyncStorage.getItem(FAVORITE_KEY);
  return data ? JSON.parse(data) : [];
};

// 添加/移除收藏
export const toggleFavorite = async (recipe) => {
  const favorites = await getFavorites();
  const index = favorites.findIndex(item => item.id === recipe.id);
  
  if (index > -1) {
    // 已收藏:移除
    favorites.splice(index, 1);
  } else {
    // 未收藏:添加
    favorites.push(recipe);
  }
  
  await AsyncStorage.setItem(FAVORITE_KEY, JSON.stringify(favorites));
  return favorites;
};

3.2.2 食谱卡片的收藏交互
 
// components/RecipeCard.js
import React, { useState, useEffect } from 'react';
import { View, Text, TouchableOpacity, Image } from 'react-native';
import { getFavorites, toggleFavorite } from '../utils/storage';

const RecipeCard = ({ recipe }) => {
  const [isFavorite, setIsFavorite] = useState(false);

  // 页面加载时,从本地缓存恢复收藏状态
  useEffect(() => {
    const initFavorite = async () => {
      const favorites = await getFavorites();
      setIsFavorite(favorites.some(item => item.id === recipe.id));
    };
    initFavorite();
  }, [recipe.id]);

  // 点击收藏按钮:更新状态+本地缓存
  const handleFavorite = async () => {
    await toggleFavorite(recipe);
    setIsFavorite(!isFavorite);
  };

  return (
    <View style={styles.card}>
      <Image source={{ uri: recipe.cover }} style={styles.cover} />
      <Text style={styles.title}>{recipe.title}</Text>
      <TouchableOpacity onPress={handleFavorite}>
        <Image
          source={isFavorite ? require('../assets/star-filled.png') : require('../assets/star-empty.png')}
          style={styles.starIcon}
        />
      </TouchableOpacity>
    </View>
  );
};
3.2.3 “我的收藏” 页面的数据联动
 
// pages/MyFavorites.js
import React, { useState, useEffect } from 'react';
import { View, Text, FlatList } from 'react-native';
import { getFavorites } from '../utils/storage';
import RecipeCard from '../components/RecipeCard';

const MyFavorites = () => {
  const [favorites, setFavorites] = useState([]);

  useEffect(() => {
    const loadFavorites = async () => {
      const data = await getFavorites();
      setFavorites(data);
    };
    loadFavorites();
  }, []);

  if (favorites.length === 0) {
    return (
      <View style={styles.emptyContainer}>
        <Text style={styles.emptyText}>暂无收藏食谱,快去收藏喜欢的内容吧~</Text>
      </View>
    );
  }

  return (
    <FlatList
      data={favorites}
      renderItem={({ item }) => <RecipeCard recipe={item} />}
      keyExtractor={item => item.id}
    />
  );
};

四、关键问题解决:三方库适配的坑点与方案

4.1 问题 1:三方库安装后鸿蒙工程编译失败

  • 原因:oh-package.json5未同步依赖,鸿蒙编译工具未识别到库;
  • 解决方案:手动将react-native-async-storage添加至oh-package.json5的dependencies,并执行ohpm install同步依赖。

4.2 问题 2:切换页面后收藏状态未自动恢复

  • 原因:页面加载时未主动读取本地缓存;
  • 解决方案:在useEffect中调用getFavorites,初始化时同步状态。

五、运行效果

5.1 功能验证效果

(说明:点击星星图标后,状态实时切换,且本地缓存同步更新)

(说明:“我的收藏” 页面成功读取本地缓存,展示已收藏的食谱)

5.2 工程启动日志

六、开发总结

6.1 技术沉淀

  1. 三方库适配原则:RN + 鸿蒙开发中,必须选用 “开源鸿蒙已兼容” 的三方库版本,避免版本不兼容问题;
  2. 状态持久化思路:页面临时状态(如收藏)需通过本地缓存(AsyncStorage)持久化,避免切换页面 / 重启应用后数据丢失;
  3. 鸿蒙工程特性:鸿蒙工程的依赖配置需同步oh-package.json5,与 RN 工程的package.json分开管理。

6.2 后续优化方向

  1. 增加 “收藏成功” 的 Toast 提示,提升交互体验;
  2. 对接真实接口时,同步实现 “本地缓存 + 接口数据” 的双向同步;
  3. 优化AsyncStorage的读写性能,避免频繁操作阻塞 UI 线程。

欢迎加入开源鸿蒙跨平台社区
https://openharmonycrossplatform.csdn.net

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐