Flutter+开源鸿蒙实战|智联邻里Day9 系统权限适配+应用全局分享+缓存深度优化+版本更新弹窗

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

<!-- Schema.org 结构化数据 -->
<script type="application/ld+json">
{
  "@context":"https://schema.org",
  "@type":"BlogPosting",
  "headline":"Flutter+开源鸿蒙实战 智联邻里Day9 系统权限适配+全局分享+缓存优化+版本更新弹窗",
  "author":{"@type":"Person","name":"鸿蒙跨端开发者"},
  "publisher":{"@type":"Organization","name":"CSDN开源鸿蒙跨平台社区"},
  "datePublished":"2026-05-06",
  "description":"智联邻里Day9 全程使用第三方库,集成share_plus全局分享、permission_handler权限管理,优化本地缓存策略,封装版本更新弹窗,完成开源鸿蒙多端权限适配与项目体验升级",
  "keywords":"Flutter,开源鸿蒙,OpenHarmony,智联邻里Day9,share_plus,permission_handler,权限适配,App全局分享,版本更新弹窗,缓存优化"
}
</script>

一、前言

哈喽小伙伴们,我们来到智联邻里Day9

回顾前面Day1~Day8,我们已经把项目整体架构、底部导航、闲置发布、图片选择、Lottie动画、GetX状态管理、一键拨号、个人中心全部开发完成,并且全程严格使用第三方库,抛弃纯原生零散写法,项目已经具备完整APP的基础功能与UI质感。

今天Day9继续延续统一格式、统一写作风格、全程第三方库开发,重点解决开源鸿蒙项目开发中两个核心痛点:权限管理、应用分享,同时深度优化本地缓存、封装全局版本更新弹窗,为后续项目打包、真机上架做铺垫。
在这里插入图片描述

今日核心开发目标:

  1. 新增 permission_handler 第三方权限库,统一管理鸿蒙相机、相册、存储、拨号权限,告别原生手动配置混乱问题;
  2. 新增 share_plus 第三方分享库,实现文字、链接、闲置信息全局分享,支持分享到微信、朋友圈、浏览器;
  3. 深度优化 shared_preferences 缓存策略,清理无效缓存、限制缓存数量、优化读取速度;
  4. 封装全局版本更新弹窗,基于GetX无Context调用,适配鸿蒙手机、平板、开发板;
  5. 统一修复前序页面适配细节、权限申请弹窗逻辑、无权限友好提示;
  6. 全程保持企业级代码规范、详细注释、鸿蒙多端适配、避坑总结、下期预告,和前面Day文章格式完全一致。

二、Day9 新增第三方库说明

今天新增两个项目必备、毕设必用、企业级标配的第三方库,继续扩充项目库生态:

第三方库 核心作用 替换原生能力 鸿蒙适配优势
permission_handler 统一申请、判断、跳转设置页面权限 替代原生AndroidManifest、鸿蒙config.json手动配置 一行代码申请权限、判断权限状态、无权限跳转系统设置,完美兼容OpenHarmony
share_plus 全局文字/链接/内容系统分享 原生需要编写原生通道、桥接代码 直接调用系统分享面板,适配鸿蒙所有应用分享入口,无需原生开发

已有全部保留库(持续复用):
flutter_screenutil、dio、shared_preferences、getx、flutter_easy_refresh、fluttertoast、connectivity_plus、image_picker、cached_network_image、lottie、url_launcher。

三、版块1:pubspec.yaml 新增依赖

打开 pubspec.yaml,在原有依赖末尾追加Day9两个新库,完整可直接复制:

dependencies:
  flutter:
    sdk: flutter
  flutter_screenutil: ^5.9.0
  dio: ^5.4.0
  shared_preferences: ^2.2.2
  getx: ^4.6.55
  flutter_easy_refresh: ^3.4.0
  fluttertoast: ^8.2.2
  connectivity_plus: ^5.0.1
  image_picker: ^1.1.1
  cached_network_image: ^3.3.0
  lottie: ^2.7.0
  url_launcher: ^6.2.5

  # Day9 新增第三方库
  permission_handler: ^11.0.1
  share_plus: ^7.2.1

终端执行依赖安装:

flutter pub get

鸿蒙&安卓权限基础配置

permission_handler 需要基础权限声明:

  1. Android 端 AndroidManifest.xml 自动兼容,无需手动加多余权限;
  2. 开源鸿蒙工程自动同步权限能力,无需手动修改 config.json,库内部已做适配。

四、版块2:permission_handler 权限管理封装(核心第三方库)

4.1 为什么要用权限库?

原生开发中,相机、相册、存储、拨号权限需要分别在安卓、鸿蒙两端手动配置,还要自己写权限申请、判断、拒绝逻辑,代码冗余、适配麻烦;
使用 permission_handler 第三方库优势:

  • 统一一套代码,同时适配安卓 + 开源鸿蒙;
  • 支持判断是否授权、永久拒绝、临时拒绝;
  • 无权限时一键跳转系统设置页面;
  • 封装工具类,全局任意页面直接调用。

4.2 全局封装权限工具类

新建 lib/utils/permission_util.dart,统一管理常用权限:

import 'package:permission_handler/permission_handler.dart';
import 'package:fluttertoast/fluttertoast.dart';

class PermissionUtil {
  // 申请相册+相机权限(发布选图专用)
  static Future<bool> requestCameraPhoto() async {
    Map<Permission, PermissionStatus> status = await [
      Permission.camera,
      Permission.photos,
      Permission.storage,
    ].request();

    // 判断是否全部授权
    bool cameraOk = status[Permission.camera]!.isGranted;
    bool photoOk = status[Permission.photos]!.isGranted;

    if(cameraOk && photoOk){
      return true;
    }else{
      Fluttertoast.showToast(msg: "请授权相机和相册权限");
      // 永久拒绝则跳转设置
      if(status[Permission.camera]!.isPermanentlyDenied ||
         status[Permission.photos]!.isPermanentlyDenied){
        await openAppSettings();
      }
      return false;
    }
  }

  // 申请拨号权限
  static Future<bool> requestCall() async {
    PermissionStatus status = await Permission.phone.request();
    if(status.isGranted){
      return true;
    }else{
      Fluttertoast.showToast(msg: "请授权拨号权限");
      if(status.isPermanentlyDenied){
        await openAppSettings();
      }
      return false;
    }
  }
}

4.3 业务页面接入权限判断

1. 图片选择前校验权限

在发布闲置页选择相册/相机前先拦截:

onTap: () async {
  bool hasPerm = await PermissionUtil.requestCameraPhoto();
  if(!hasPerm) return;
  // 有权限再执行选图逻辑
  XFile? image = await ImageUtil.pickImage(source: ImageSource.gallery);
}
2. 一键拨号前校验权限
onTap: () async {
  bool hasPerm = await PermissionUtil.requestCall();
  if(!hasPerm) return;
  LaunchUtil.callPhone(idle.contact);
}

4.4 鸿蒙适配说明

permission_handler 完美适配 OpenHarmony 系统权限机制,在DAYU200开发板、鸿蒙手机、平板上均可正常弹窗申请权限,永久拒绝后自动跳转系统应用设置页面,不用额外写鸿蒙原生代码。

五、版块3:share_plus 全局分享功能开发

5.1 库功能介绍

share_plus 是Flutter官方推荐的系统分享第三方库,支持:

  • 纯文字分享
  • 链接+文字分享
  • 本地文件、图片分享
    自动调出鸿蒙系统原生分享面板,可分享至微信、朋友圈、浏览器、备忘录等。
    在这里插入图片描述

5.2 封装分享工具类

新建 lib/utils/share_util.dart

import 'package:share_plus/share_plus.dart';
import 'package:flutter/material.dart';

class ShareUtil {
  // 分享闲置物品信息
  static Future<void> shareIdleInfo({
    required String title,
    required String desc,
    required String contact,
    required BuildContext context,
  }) async {
    String shareText = "【智联邻里闲置分享】\n物品:$title\n简介:$desc\n联系方式:$contact";

    await Share.share(
      shareText,
      subject: "智联邻里闲置好物分享",
      sharePositionOrigin: Rect.fromCenter(
        center: const Offset(200, 400),
        width: 100,
        height: 100,
      ),
    );
  }

  // 普通文字链接分享
  static Future<void> shareLink(String url,String title) async {
    await Share.share("$title \n链接:$url");
  }
}

5.3 闲置详情页添加分享按钮

修改 idle_detail_page.dart 右上角新增分享图标:

appBar: AppBar(
  title: const Text("闲置详情"),
  actions: [
    // 新增分享按钮
    IconButton(
      icon: const Icon(Icons.share),
      onTap: (){
        ShareUtil.shareIdleInfo(
          title: idle.title,
          desc: idle.description,
          contact: idle.contact,
          context: context,
        );
      },
    ),
    IconButton(
      icon: const Icon(Icons.delete, color: Colors.red),
      onPressed: () => Get.find<IdleController>().deleteIdle(idle.id),
    ),
  ],
),

5.4 鸿蒙适配细节

  1. 分享面板自动适配鸿蒙手机底部弹出、平板居中弹出;
  2. 支持鸿蒙系统所有已安装社交应用;
  3. 无第三方分享应用时,系统自动保留备忘录、短信、浏览器选项,不会闪退。

六、版块4:SharedPreferences 缓存深度优化

6.1 优化痛点

前期直接无脑存入缓存,容易造成:缓存数据过多、冗余垃圾数据、读取卡顿、列表加载缓慢。
Day9 做三层优化:

  1. 限制闲置列表最大缓存条数,超出自动删除最早数据;
  2. 发布新数据时自动去重,避免重复缓存;
  3. 读取缓存异常捕获,损坏缓存自动清空重建。

6.2 优化后缓存核心逻辑

IdleController 修改发布存储逻辑:

// 限制最大缓存条数
const int maxIdleCount = 20;

// 存入缓存时优化
List<String> idleStrList = prefs.getStringList("idle_list") ?? [];
// 去重
idleStrList.removeWhere((str) => str.contains(newIdle.id));
// 加入新数据
idleStrList.add(idleStr);
// 超出限制裁剪
if(idleStrList.length > maxIdleCount){
  idleStrList = idleStrList.sublist(idleStrList.length - maxIdleCount);
}
await prefs.setStringList("idle_list", idleStrList);

6.3 异常容错处理

读取缓存失败、JSON解析异常时,自动清空旧缓存并初始化空列表,避免APP闪退。

七、版块5:封装全局版本更新弹窗(GetX 无Context)

7.1 功能说明

基于GetX封装全局版本更新提示,APP启动自动检测,有新版本弹出弹窗,支持:立即更新、稍后提醒,适配鸿蒙多端弹窗尺寸。
在这里插入图片描述

7.2 封装全局更新方法

lib/utils/update_util.dart

import 'package:get/get.dart';
import 'package:flutter/material.dart';

class UpdateUtil {
  // 模拟版本检测
  static void checkVersion() {
    // 模拟接口检测版本
    String nowVersion = "1.0.0";
    String newVersion = "1.0.1";

    if(nowVersion != newVersion){
      _showUpdateDialog();
    }
  }

  // GetX 无Context弹窗
  static void _showUpdateDialog(){
    Get.dialog(
      AlertDialog(
        title: const Text("发现新版本"),
        content: const Text("修复已知问题,优化鸿蒙设备适配体验,建议立即更新!"),
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.r)),
        actions: [
          TextButton(
            onPressed: ()=>Get.back(),
            child: const Text("稍后提醒"),
          ),
          TextButton(
            onPressed: (){
              Get.back();
              // 可跳转应用市场或HAP下载地址
              Fluttertoast.showToast(msg: "正在跳转更新页面");
            },
            child: const Text("立即更新",style: TextStyle(color: Colors.green)),
          ),
        ],
      ),
      barrierDismissible: false,
    );
  }
}

7.3 项目启动全局检测

main.dart 启动时调用:

void main() {
  Get.lazyPut(() => IdleController());
  // 启动检测版本更新
  UpdateUtil.checkVersion();
  runApp(const MyApp());
}

八、版块6:鸿蒙多端适配统一优化

  1. 权限弹窗适配:手机底部弹窗、平板居中弹窗,自动适配屏幕;
  2. 分享面板适配:跟随鸿蒙系统原生样式,不遮挡页面布局;
  3. 版本更新弹窗:大屏加宽内边距、小屏紧凑布局,圆角统一;
  4. 缓存适配:缓存路径遵循开源鸿蒙沙箱机制,不会被系统随意清理。

九、版块7:Day9 常见问题避坑总结

  1. permission_handler 权限不弹窗:检查依赖版本、执行 flutter clean 重新编译;
  2. 分享面板空白:手机未安装社交APP,属于系统正常现象;
  3. 缓存越来越多:未做最大条数限制,采用今日裁剪逻辑即可;
  4. GetX弹窗报错:未全局注册控制器、页面未使用GetMaterialApp。

十、Day9 开发总结

  1. 新增 permission_handler、share_plus 两大第三方库,搞定鸿蒙权限统一管理、系统全局分享;
  2. 封装权限工具类、分享工具类,全局复用,代码高度解耦;
  3. 深度优化本地缓存策略,限制条数、去重、异常容错,提升APP流畅度;
  4. 基于GetX实现无Context版本更新弹窗,适配鸿蒙多端;
  5. 完善全页面权限拦截逻辑,无权限友好提示、跳转设置,用户体验大幅提升。

十一、下期Day10预告

Day10 项目收尾终极篇:

  • 项目整体代码梳理、冗余代码删减;
  • 统一全局主题色、字体、图标规范;
  • 开源鸿蒙HAP正式打包、签名配置;
  • 真机完整运行测试、功能全流程验收;
  • 整套项目毕设结题文档思路梳理。
Logo

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

更多推荐