Flutter for OpenHarmony 万能游戏库App实战 - 收藏功能实现

收藏功能是一个重要的用户功能。这篇文章我们来实现一个完整的收藏系统,包括收藏管理、多类型支持、以及收藏列表展示。通过这个功能,我们能展示如何构建一个跨功能的数据管理系统

收藏数据模型

FavoriteItem类代表一个收藏项:

dart 复制代码
class FavoriteItem {
  final String id;
  final String type;
  final String name;
  final String? imageUrl;
  final Map<String, dynamic> data;

  FavoriteItem({
    required this.id,
    required this.type,
    required this.name,
    this.imageUrl,
    required this.data,
  });
}

id是收藏项的唯一标识。
type表示收藏项的类型(pokemon、free_game、rick_morty等)。
data存储完整的项目数据,用于导航到详情页面。

收藏提供者

FavoritesProvider使用Provider模式管理收藏:

dart 复制代码
class FavoritesProvider extends ChangeNotifier {
  List<FavoriteItem> _favorites = [];

  List<FavoriteItem> get favorites => _favorites;

  bool isFavorite(String id, String type) {
    return _favorites.any((item) => item.id == id && item.type == type);
  }

  void toggleFavorite(FavoriteItem item) {
    final index = _favorites.indexWhere((f) => f.id == item.id && f.type == item.type);
    if (index >= 0) {
      _favorites.removeAt(index);
    } else {
      _favorites.add(item);
    }
    notifyListeners();
  }

  List<FavoriteItem> getFavoritesByType(String type) {
    return _favorites.where((item) => item.type == type).toList();
  }
}

toggleFavorite用来切换收藏状态。
getFavoritesByType用来获取特定类型的收藏。

收藏列表页面

FavoritesScreen展示所有收藏:

dart 复制代码
class FavoritesScreen extends StatelessWidget {
  const FavoritesScreen({super.key});

  @override
  Widget build(BuildContext context) {
    final l10n = AppLocalizations.of(context);
    
    return DefaultTabController(
      length: 4,
      child: Scaffold(
        appBar: AppBar(
          title: Text(l10n.favorites),
          bottom: TabBar(
            isScrollable: true,
            tabs: [
              Tab(text: '全部'),
              Tab(text: l10n.pokemon),
              Tab(text: l10n.freeGames),
              Tab(text: l10n.rickMorty),
            ],
          ),
        ),
        body: Consumer<FavoritesProvider>(
          builder: (context, favorites, _) {
            return TabBarView(
              children: [
                _FavoritesList(items: favorites.favorites, l10n: l10n),
                _FavoritesList(items: favorites.getFavoritesByType('pokemon'), l10n: l10n),
                _FavoritesList(items: favorites.getFavoritesByType('free_game'), l10n: l10n),
                _FavoritesList(items: favorites.getFavoritesByType('rick_morty'), l10n: l10n),
              ],
            );
          },
        ),
      ),
    );
  }
}

使用TabBar展示不同类型的收藏。
使用Consumer监听FavoritesProvider的变化。

收藏列表项

_FavoritesList展示收藏列表:

dart 复制代码
class _FavoritesList extends StatelessWidget {
  final List<FavoriteItem> items;
  final AppLocalizations l10n;

  const _FavoritesList({required this.items, required this.l10n});

  void _navigateToDetail(BuildContext context, FavoriteItem item) {
    switch (item.type) {
      case 'pokemon':
        final id = item.data['id'];
        if (id != null) {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (_) => PokemonDetailScreen(pokemonId: id is int ? id : int.tryParse(id.toString()) ?? 1)),
          );
        }
        break;
      case 'free_game':
        final id = item.data['id'];
        if (id != null) {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (_) => GameDetailScreen(gameId: id is int ? id : int.tryParse(id.toString()) ?? 1)),
          );
        }
        break;
      case 'rick_morty':
        Navigator.push(
          context,
          MaterialPageRoute(builder: (_) => CharacterDetailScreen(character: item.data)),
        );
        break;
    }
  }

根据收藏项的类型导航到对应的详情页面。

总结

这篇文章我们实现了一个完整的收藏系统。涉及到的知识点包括:

  • 数据模型 - 设计通用的收藏数据模型
  • 状态管理 - 使用Provider管理收藏状态
  • 多类型支持 - 支持多种类型的收藏
  • Tab导航 - 使用TabBar展示不同类型的收藏
  • 导航集成 - 从收藏列表导航到详情页面
  • 国际化 - 支持多语言显示

收藏功能展示了如何构建一个跨功能的数据管理系统 。通过合理的数据模型和状态管理,我们能为用户提供一个完整的收藏体验


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

相关推荐
CAE虚拟与现实23 分钟前
docker desktop中的build功能是要build什么
java·docker·容器
PHP实战开发录1 小时前
PHP脚本手动能跑定时任务却失败
开发语言·php·开发
郝学胜-神的一滴2 小时前
Effective Python 条款 10 :海象运算符_=
开发语言·python·程序人生·开源
wuyk5552 小时前
Python零基础入门第十四章:异常处理(try-except)
开发语言·python
2601_962078192 小时前
Appium+Python+pytest自动化测试框架详解
自动化测试·python·appium·pytest·移动应用
wuyk5552 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
allnlei3 小时前
s6-overlay - 装在 Docker 容器里的轻量级管家
java·docker·容器
卷无止境6 小时前
智能体开发环境ADE浅析,编程工具的下一次范式跃迁
后端·python
彧azz8 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
IT_Octopus8 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea