Flutter for OpenHarmony 万能游戏库App实战 - 个人中心实现

个人中心是用户了解自己收藏和统计信息的重要页面。这篇文章我们来实现一个完整的个人中心页面,包括用户信息展示、收藏统计、以及快速导航。通过这个功能,我们能展示如何构建一个信息汇总页面 。

页面的基本结构

ProfileScreen是个人中心的主页面:

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

  @override
  Widget build(BuildContext context) {
    final l10n = AppLocalizations.of(context);
    
    return Scaffold(
      appBar: AppBar(title: Text(l10n.profile)),
      body: SingleChildScrollView(
        child: Column(
          children: [
            _buildHeader(context, l10n),
            _buildStats(context, l10n),
            const SizedBox(height: 16),
            _buildMenuSection(context, l10n),
          ],
        ),
      ),
    );
  }
}

页面包含三个主要部分:头部、统计信息、菜单。

头部设计

_buildHeader方法显示用户信息:

dart 复制代码
  Widget _buildHeader(BuildContext context, AppLocalizations l10n) {
    return Container(
      padding: const EdgeInsets.all(24),
      decoration: BoxDecoration(
        gradient: LinearGradient(
          begin: Alignment.topLeft,
          end: Alignment.bottomRight,
          colors: [Theme.of(context).colorScheme.primary, Theme.of(context).colorScheme.secondary],
        ),
      ),
      child: Row(
        children: [
          CircleAvatar(
            radius: 40,
            backgroundColor: Colors.white,
            child: Icon(Icons.person, size: 48, color: Theme.of(context).colorScheme.primary),
          ),
          const SizedBox(width: 16),
          Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(l10n.gamer, style: const TextStyle(color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold)),
                const SizedBox(height: 4),
                Text(l10n.exploreGames, style: const TextStyle(color: Colors.white70)),
              ],
            ),
          ),
        ],
      ),
    );
  }

头部用渐变背景,显示用户头像和欢迎信息。

收藏统计

_buildStats方法显示收藏统计:

dart 复制代码
  Widget _buildStats(BuildContext context, AppLocalizations l10n) {
    return Consumer<FavoritesProvider>(
      builder: (context, favorites, _) {
        final pokemonCount = favorites.getFavoritesByType('pokemon').length;
        final gameCount = favorites.getFavoritesByType('free_game').length;
        final characterCount = favorites.getFavoritesByType('rick_morty').length;

        return Padding(
          padding: const EdgeInsets.all(16),
          child: Row(
            children: [
              _buildStatCard(context, l10n.pokemon, pokemonCount, Icons.catching_pokemon, Colors.red),
              const SizedBox(width: 12),
              _buildStatCard(context, l10n.games, gameCount, Icons.sports_esports, Colors.blue),
              const SizedBox(width: 12),
              _buildStatCard(context, l10n.characters, characterCount, Icons.movie, Colors.orange),
            ],
          ),
        );
      },
    );
  }

使用Consumer监听FavoritesProvider的变化。
显示三个统计卡片:宝可梦、游戏、角色。

_buildStatCard方法创建统计卡片:

dart 复制代码
  Widget _buildStatCard(BuildContext context, String label, int count, IconData icon, Color color) {
    return Expanded(
      child: Card(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            children: [
              Icon(icon, color: color, size: 28),
              const SizedBox(height: 8),
              Text('$count', style: Theme.of(context).textTheme.headlineSmall?.copyWith(fontWeight: FontWeight.bold)),
              Text(label, style: TextStyle(color: Colors.grey[600], fontSize: 12)),
            ],
          ),
        ),
      ),
    );
  }

每个统计卡片显示图标、数量和标签。

菜单部分

_buildMenuSection方法显示菜单项:

dart 复制代码
  Widget _buildMenuSection(BuildContext context, AppLocalizations l10n) {
    return Padding(
      padding: const EdgeInsets.all(16),
      child: Column(
        children: [
          _buildMenuItem(
            context,
            icon: Icons.favorite,
            title: l10n.favorites,
            subtitle: l10n.viewFavorites,
            onTap: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const FavoritesScreen())),
          ),
          const SizedBox(height: 8),
          _buildMenuItem(
            context,
            icon: Icons.settings,
            title: l10n.settings,
            subtitle: l10n.appSettings,
            onTap: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const SettingsScreen())),
          ),
          const SizedBox(height: 8),
          _buildMenuItem(
            context,
            icon: Icons.info,
            title: l10n.about,
            subtitle: l10n.appInfo,
            onTap: () => Navigator.push(context, MaterialPageRoute(builder: (_) => const AboutScreen())),
          ),
        ],
      ),
    );
  }

菜单项包括收藏、设置、关于。

_buildMenuItem方法创建菜单项:

dart 复制代码
  Widget _buildMenuItem(
    BuildContext context, {
    required IconData icon,
    required String title,
    required String subtitle,
    required VoidCallback onTap,
  }) {
    return Card(
      child: ListTile(
        leading: Icon(icon, color: Theme.of(context).colorScheme.primary),
        title: Text(title),
        subtitle: Text(subtitle),
        trailing: const Icon(Icons.chevron_right),
        onTap: onTap,
      ),
    );
  }

每个菜单项用ListTile展示。

总结

这篇文章我们实现了一个个人中心页面。涉及到的知识点包括:

  • 信息汇总 - 在一个页面展示多种信息
  • 渐变背景 - 使用LinearGradient创建视觉效果
  • 统计展示 - 显示收藏统计信息
  • 菜单导航 - 快速导航到其他页面
  • 状态监听 - 使用Consumer监听状态变化
  • 国际化 - 支持多语言显示

个人中心页面展示了如何构建一个信息汇总页面 。通过合理的布局和清晰的信息展示,我们能为用户提供一个完整的个人信息中心。


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

相关推荐
Wang's Blog2 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
xixingzhe22 小时前
图表中同比与环比的区别:看趋势还是看变化?
开发语言·python
程序员大阳3 小时前
副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式
javascript·json·序列化·反序列化·stringify·parse
forest_093 小时前
当 AI 搜索开始「自我进化」,谁来进化它的核实?——「已核实」结论复核器:3 条结论挖出 2 个洞(附可运行代码)
人工智能·python·机器学习·prompt·agi
海雅达手持终端PDA3 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
释厄6233 小时前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin
香蕉大香蕉(06敬畏市场)3 小时前
MySQL 单点详解(01)
java·数据库·mysql·面试·博客·实习
小小张说故事3 小时前
Python 的 str 为什么设计成不可变?拆开字符串驻留、字符串池,以及 += 拼接到底慢在哪
后端·python
LaughingZhu3 小时前
Product Hunt 热榜 2026-10-30:Empacer、Scape、Floot in ChatGPT
java·前端·数据库·人工智能·chatgpt·notion