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

前言

作为鸿蒙开发者,入门Flutter跨端开发能实现一套代码运行在Android、iOS、鸿蒙6.0+等多平台,大幅降低开发成本。本文基于鸿蒙6.0(API20+)环境,通过【Flutter仿备忘录APP】实战案例,手把手教你集成常用三方库、完成鸿蒙平台适配,全程步骤详细、代码带注释,新手也能直接跟着做!

文章核心信息

  • 开发环境:Flutter 3.22.0+、鸿蒙6.0(SDK API20+)、DevEco Studio 5.0+

  • 核心知识点:Flutter基础项目搭建、三方库集成与使用、鸿蒙6.0平台适配

  • 目标成果:可在鸿蒙6.0设备正常运行的Flutter备忘录APP

目录

  1. 环境准备(Flutter+鸿蒙6.0配置)

  2. 项目创建:Flutter备忘录APP初始化

  3. 三方库选型与集成(鸿蒙兼容版)

  4. 核心功能代码实现(带详细注释)

  5. 鸿蒙6.0(API20+)专属适配

  6. 项目编译运行与效果验证

  7. 常见问题解决方案


一、环境准备(Flutter+鸿蒙6.0配置)

1.1 基础环境安装

  1. 安装Flutter SDK(3.22.0及以上):Flutter官网

  2. 安装DevEco Studio 5.0+,下载鸿蒙6.0(API20+)SDK

  3. 配置Flutter鸿蒙支持:

# 命令行启用Flutter鸿蒙平台支持
flutter config --enable-openharmony
  1. 验证环境:
flutter doctor

确保输出中OpenHarmony项显示正常,无报错。

1.2 鸿蒙6.0(API20+)关键配置要求

  • 最低SDK版本:minSdkVersion 20

  • 鸿蒙系统版本:HarmonyOS 6.0及以上

  • 编译工具:DevEco Studio 5.0+


二、创建Flutter备忘录项目

2.1 命令行创建项目

# 创建Flutter项目(支持鸿蒙平台)
flutter create flutter_harmony_note
# 进入项目目录
cd flutter_harmony_note

2.2 鸿蒙平台配置修改

打开项目中 openharmony/app/build.gradle 文件,修改SDK版本为API20+:

openharmony {
    compileSdkVersion 20 // 鸿蒙API20
    defaultConfig {
        minSdkVersion 20 // 最低支持鸿蒙6.0(API20)
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
}

三、Flutter三方库选型(鸿蒙6.0兼容)

本次案例集成3个高频实用三方库,均兼容鸿蒙6.0(API20+):

三方库名称 版本 作用
shared_preferences ^2.2.0 本地数据持久化(保存备忘录)
fluttertoast ^8.2.2 鸿蒙平台消息提示
intl ^0.19.0 时间格式化(备忘录创建时间)

3.1 集成三方库

打开项目根目录 pubspec.yaml 文件,添加依赖:

dependencies:
  flutter:
    sdk: flutter
  # 本地存储三方库(鸿蒙兼容)
  shared_preferences: ^2.2.0
  # 消息提示三方库(鸿蒙兼容)
  fluttertoast: ^8.2.2
  # 时间格式化三方库
  intl: ^0.19.0

执行命令安装依赖:

flutter pub get

四、核心功能代码实现

我们将实现备忘录列表展示、添加笔记、删除笔记、本地持久化核心功能,代码全注释讲解。

4.1 主文件lib/main.dart完整代码

import 'package:flutter/material.dart';
// 本地存储三方库:鸿蒙平台数据持久化
import 'package:shared_preferences/shared_preferences.dart';
// 消息提示三方库:鸿蒙设备弹窗提示
import 'package:fluttertoast/fluttertoast.dart';
// 时间格式化三方库
import 'package:intl/intl.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter鸿蒙备忘录',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const NotePage(),
      // 关闭调试标签
      debugShowCheckedModeBanner: false,
    );
  }
}

// 备忘录主页面
class NotePage extends StatefulWidget {
  const NotePage({super.key});

  
  State<NotePage> createState() => _NotePageState();
}

class _NotePageState extends State<NotePage> {
  // 输入框控制器:获取用户输入的笔记内容
  final TextEditingController _noteController = TextEditingController();
  // 备忘录数据列表:存储所有笔记
  List<String> _noteList = [];
  // 本地存储对象:三方库shared_preferences实例
  late SharedPreferences _prefs;

  
  void initState() {
    super.initState();
    // 页面初始化时加载本地存储的笔记
    _initPrefs();
  }

  // 初始化本地存储(鸿蒙平台兼容)
  Future<void> _initPrefs() async {
    _prefs = await SharedPreferences.getInstance();
    // 加载本地保存的笔记数据
    _loadNotes();
  }

  // 加载本地笔记数据
  void _loadNotes() {
    setState(() {
      // 从shared_preferences中读取笔记列表,无数据则返回空数组
      _noteList = _prefs.getStringList('notes') ?? [];
    });
  }

  // 保存笔记到本地(三方库核心用法)
  Future<void> _saveNote() async {
    String note = _noteController.text.trim();
    if (note.isEmpty) {
      // 鸿蒙平台提示:输入不能为空
      Fluttertoast.showToast(msg: "请输入笔记内容");
      return;
    }

    // 获取当前时间(格式化)
    String time = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now());
    String newNote = "$time | $note";

    setState(() {
      _noteList.add(newNote);
      // 清空输入框
      _noteController.clear();
    });

    // 保存到本地存储
    await _prefs.setStringList('notes', _noteList);
    // 鸿蒙平台提示:保存成功
    Fluttertoast.showToast(msg: "笔记保存成功");
  }

  // 删除笔记
  Future<void> _deleteNote(int index) async {
    setState(() {
      _noteList.removeAt(index);
    });
    // 更新本地存储
    await _prefs.setStringList('notes', _noteList);
    Fluttertoast.showToast(msg: "笔记删除成功");
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Flutter+鸿蒙 备忘录')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            // 笔记输入框
            TextField(
              controller: _noteController,
              decoration: const InputDecoration(
                hintText: "请输入笔记内容",
                border: OutlineInputBorder(),
              ),
              maxLines: 3,
            ),
            const SizedBox(height: 10),
            // 保存按钮
            ElevatedButton(
              onPressed: _saveNote,
              child: const Text("保存笔记"),
            ),
            const SizedBox(height: 20),
            // 笔记列表标题
            const Text(
              "备忘录列表",
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const Divider(),
            // 笔记列表展示
            Expanded(
              child: _noteList.isEmpty
                  ? const Center(child: Text("暂无笔记,快去添加吧~"))
                  : ListView.builder(
                      itemCount: _noteList.length,
                      itemBuilder: (context, index) {
                        return ListTile(
                          title: Text(_noteList[index]),
                          trailing: IconButton(
                            icon: const Icon(Icons.delete, color: Colors.red),
                            onPressed: () => _deleteNote(index),
                          ),
                        );
                      },
                    ),
            ),
          ],
        ),
      ),
    );
  }
}

4.2 代码核心解释

  1. shared_preferences:鸿蒙平台轻量级本地存储,用于永久保存备忘录,重启APP数据不丢失。

  2. fluttertoast:适配鸿蒙系统的消息提示,替代原生弹窗,体验更贴合鸿蒙设备。

  3. intl:统一格式化时间,保证多平台(含鸿蒙)时间显示一致。


五、鸿蒙6.0(API20+)专属适配

5.1 鸿蒙权限配置

打开 openharmony/app/src/main/module.json5 文件,添加本地存储权限(API20+规范):

{
  "module": {
    "abilities": [],
    "requestPermissions": [
      {
        "name": "ohos.permission.WRITE_LOCAL_STORAGE",
        "reason": "用于保存备忘录数据"
      },
      {
        "name": "ohos.permission.READ_LOCAL_STORAGE",
        "reason": "用于读取备忘录数据"
      }
    ]
  }
}

5.2 鸿蒙屏幕适配

Flutter默认适配鸿蒙全面屏,无需额外代码,若需适配鸿蒙折叠屏,可添加如下代码:

在 lib/main.dart 的 MaterialApp 中添加:

builder: (context, child) {
  // 鸿蒙折叠屏/全面屏适配
  return MediaQuery(
    data: MediaQuery.of(context).copyWith(
      // 忽略鸿蒙系统底部导航栏遮挡
      viewPadding: EdgeInsets.zero,
    ),
    child: child!,
  );
},

六、编译运行(鸿蒙6.0设备/模拟器)

6.1 运行方式1:命令行运行

  1. 连接鸿蒙6.0设备(开启开发者模式+USB调试)

  2. 执行命令:

# 查看已连接的鸿蒙设备
flutter devices
# 运行项目到鸿蒙设备
flutter run -d 设备ID

6.2 运行方式2:DevEco Studio运行

  1. 用DevEco Studio打开项目

  2. 选择鸿蒙6.0模拟器/真机

  3. 点击「运行」按钮,等待编译完成

6.3 效果验证

✅ 成功在鸿蒙6.0(API20+)设备显示APP界面

✅ 输入笔记点击保存,数据持久化存储

✅ 支持删除笔记,鸿蒙设备弹出提示

✅ 三方库全部正常运行,无兼容问题


七、鸿蒙+Flutter常见问题解决方案

问题1:三方库在鸿蒙6.0上无法使用

解决方案:升级三方库到最新稳定版,确保支持API20+,执行:

flutter pub upgrade

问题2:鸿蒙设备运行白屏

解决方案:检查 build.gradle 中 minSdkVersion 是否为20,确认鸿蒙系统版本≥6.0。

问题3:本地存储无权限

解决方案:严格按照API20+规范配置 module.json5 权限,重启APP授权。


总结

本文通过Flutter备忘录APP实战,完成了Flutter+三方库+鸿蒙6.0(API20+)全流程开发:

  1. 掌握Flutter项目鸿蒙6.0环境配置

  2. 学会集成并使用shared_preferences、fluttertoast、intl三个核心三方库

  3. 搞定鸿蒙API20+权限、屏幕适配

  4. 实现一套代码运行在鸿蒙6.0+设备的跨端应用

作为鸿蒙开发者,Flutter跨端开发能快速拓展技术栈,后续可集成更多三方库(网络请求、图片加载等),开发更复杂的鸿蒙跨平台应用!


MD文档使用说明

  1. 直接复制本文内容,保存为 flutter_harmony_lib_tutorial.md 文件

  2. 用Markdown编辑器(VSCode、Typora)打开即可查看

  3. 代码可直接复制运行,适配鸿蒙6.0(API20+)

Logo

一站式 AI 云服务平台

更多推荐