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

技术栈:Flutter(鸿蒙适配版)+ 三方库(provider + shared_preferences)
适用平台:鸿蒙 6.0(HarmonyOS NEXT / OpenHarmony)API 20+
阅读收益:跟随本文,你将掌握如何在鸿蒙设备上使用 Flutter 集成三方库、实现状态管理和本地持久化,打造一款零干扰、即开即用的轻量级草稿本。

一、为什么选择极简草稿本?

在鸿蒙生态下,开发者常常需要快速验证跨端技术的可行性。一个零干扰的纯文本输入环境,恰恰是检验 Flutter UI 渲染能力、三方库兼容性和状态管理机制的理想场景。本项目将构建一个“轻量级草稿本”——无保存按钮(输入即存储)、无历史记录(关闭即遗忘),所有数据仅在会话内有效,与鸿蒙“轻量化、服务原子化”理念高度契合。

截止 2026 年初,OpenHarmony 社区维护的 flutter_packages 仓库已适配超过 469 个 Flutter 三方库,覆盖网络请求、本地存储、状态管理等主流场景。本文选用两个高频库:provider(状态管理)和shared_preferences(本地持久化),助力掌握鸿蒙跨端开发核心技能。

二、环境准备:确保基础配置万无一失

工具/环境 版本要求 用途说明
DevEco Studio ≥ 5.0(推荐最新版) 鸿蒙官方 IDE
HarmonyOS SDK API 20+ 鸿蒙系统 SDK
Flutter SDK 鸿蒙适配版(≥ 3.10.0) 跨端开发框架
Dart SDK ≥ 3.0.0 编程语言

2.1 安装鸿蒙适配版 Flutter SDK

官方 Flutter 暂未正式支持鸿蒙,需使用社区适配版本,终端执行以下命令:

git clone https://gitcode.com/openharmony-sig/flutter_flutter.git

下载完成后,将 flutter\_flutter\\bin 目录添加到系统 PATH 环境变量,执行以下命令验证:

flutter --version

输出包含 HarmonyOSohos 字样即环境就绪。

2.2 配置 HarmonyOS SDK

  1. 打开 DevEco Studio,进入 File → Settings → OpenHarmony SDK(macOS 为 Preferences)。

  2. SDK Platforms 选项卡下,勾选 API Version 20 或更高版本并下载。

  3. 记录 SDK 安装路径(通常为 C:\\Users\\你的用户名\\AppData\\Local\\OpenHarmony\\SdkC:\\Program Files\\Huawei\\DevEco Studio\\sdk),后续备用。

2.3 关联 Flutter 与鸿蒙 SDK

终端执行以下命令绑定 Flutter 与鸿蒙 SDK:

flutter config --ohos-sdk="你的鸿蒙SDK路径"

执行 flutter doctor \-v,确保 HarmonyOS toolchain 显示绿色勾号 \[√\]

在这里插入图片描述

三、项目初始化:从零创建鸿蒙 Flutter 工程

3.1 创建项目并添加鸿蒙支持

# 创建 Flutter 项目(项目名:quick_draft)
flutter create quick_draft

# 进入项目目录
cd quick_draft

# 为项目添加鸿蒙平台支持(注意末尾的点)
flutter create --platforms ohos .

执行成功后,项目根目录会出现 ohos/ 文件夹(鸿蒙工程核心目录)。

在这里插入图片描述

3.2 配置三方库依赖

打开 pubspec\.yaml,在 dependencies 中添加以下内容:

name: quick_draft
description: "极简草稿本 - 一个即开即用的零干扰输入工具"

dependencies:
  flutter:
    sdk: flutter
  
  # 状态管理库 - 简化跨组件数据共享
  provider: ^6.1.2
  
  # 本地持久化存储 - 支持鸿蒙平台
  shared_preferences: ^2.3.5

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^3.0.0

flutter:
  uses-material-design: true

保存后执行:

flutter pub get

Flutter 工具会自动处理鸿蒙相关依赖并生成对应的 \.har 包。

四、核心代码实现:构建零干扰输入体验

4.1 数据模型与状态管理(lib/models/draft\_model\.dart

创建继承自 ChangeNotifier 的数据模型,管理草稿内容和 UI 状态:

// lib/models/draft_model.dart
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

/// 草稿数据模型 - 继承 ChangeNotifier 以支持 provider 状态管理
class DraftModel extends ChangeNotifier {
  String _content = '';                // 当前输入的草稿内容
  bool _hasContent = false;            // 是否有实际内容(去除空格后)
  static const String _storageKey = 'quick_draft_content';

  // 获取当前草稿内容
  String get content => _content;
  
  // 判断是否有有效内容(用于控制清空按钮的显示/隐藏)
  bool get hasContent => _hasContent;

  /// 初始化 - 从本地存储加载上次未提交的草稿内容
  Future<void> init() async {
    final prefs = await SharedPreferences.getInstance();
    _content = prefs.getString(_storageKey) ?? '';
    _updateHasContent();
    notifyListeners();  // 通知所有监听者更新 UI
  }

  /// 更新草稿内容(每次输入时自动调用)
  void updateContent(String newContent) {
    _content = newContent;
    _updateHasContent();
    _saveToStorage();   // 自动持久化,无需保存按钮
    notifyListeners();
  }

  /// 清空草稿内容
  void clearContent() {
    _content = '';
    _hasContent = false;
    _saveToStorage();
    notifyListeners();
  }

  // 更新内容是否有效的标志位(trim 后非空即为有效)
  void _updateHasContent() {
    _hasContent = _content.trim().isNotEmpty;
  }

  // 将当前内容写入本地存储
  Future<void> _saveToStorage() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString(_storageKey, _content);
  }
}

4.2 应用入口配置(lib/main\.dart

使用MultiProvider 在应用顶层注入 DraftModel,确保全局可访问:

// lib/main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'models/draft_model.dart';
import 'pages/draft_page.dart';

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

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

  
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        // 注入 DraftModel,全局唯一实例
        ChangeNotifierProvider(create: (_) => DraftModel()),
      ],
      child: MaterialApp(
        title: '极简草稿本',
        theme: ThemeData(
          brightness: Brightness.light,
          primarySwatch: Colors.blueGrey,
          useMaterial3: true,
        ),
        darkTheme: ThemeData(
          brightness: Brightness.dark,
          primarySwatch: Colors.blueGrey,
          useMaterial3: true,
        ),
        themeMode: ThemeMode.system,      // 自动跟随系统深色模式
        home: const DraftPage(),
      ),
    );
  }
}

4.3 主界面实现(lib/pages/draft\_page\.dart

实现无边框输入框和动态清空按钮,核心代码如下:

// lib/pages/draft_page.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/draft_model.dart';

class DraftPage extends StatefulWidget {
  const DraftPage({super.key});

  
  State<DraftPage> createState() => _DraftPageState();
}

class _DraftPageState extends State<DraftPage> {
  late final TextEditingController _controller;

  
  void initState() {
    super.initState();
    _controller = TextEditingController();
    
    // 页面初始化后加载存储中的草稿内容
    WidgetsBinding.instance.addPostFrameCallback((_) {
      context.read<DraftModel>().init().then((_) {
        // 将模型中的内容同步到 TextEditingController
        _controller.text = context.read<DraftModel>().content;
      });
    });
  }

  
  void dispose() {
    _controller.dispose();  // 释放资源,防止内存泄漏
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('极简草稿本'),
        centerTitle: true,
        elevation: 0,
        actions: [
          // 动态清空按钮 - 仅当有内容时显示
          Consumer<DraftModel>(
            builder: (context, model, child) {
              if (!model.hasContent) {
                return const SizedBox.shrink();
              }
              return IconButton(
                icon: const Icon(Icons.delete_sweep_outlined),
                tooltip: '清空',
                onPressed: () {
                  _controller.clear();
                  model.clearContent();
                },
              );
            },
          ),
        ],
      ),
      body: Consumer<DraftModel>(
        builder: (context, model, child) {
          return Padding(
            padding: const EdgeInsets.all(16.0),
            child: TextField(
              controller: _controller,
              decoration: const InputDecoration(
                border: InputBorder.none,          // 无边框
                focusedBorder: InputBorder.none,   // 聚焦时无边框
                enabledBorder: InputBorder.none,   // 非聚焦时无边框
                hintText: '在这里随意输入...',
                hintStyle: TextStyle(
                  color: Colors.grey,
                  fontSize: 16,
                ),
              ),
              style: TextStyle(
                fontSize: 16,
                height: 1.4,
                color: Theme.of(context).brightness == Brightness.dark
                    ? Colors.white
                    : Colors.black87,
              ),
              maxLines: null,                       // 无限行数
              expands: false,
              autofocus: true,                      // 自动获取焦点
              onChanged: (value) {
                // 每次输入都同步到模型并自动持久化
                model.updateContent(value);
              },
            ),
          );
        },
      ),
    );
  }
}

五、配置鸿蒙签名并运行

5.1 在 DevEco Studio 中配置签名

  1. 用 DevEco Studio 单独打开项目下的 ohos 文件夹。

  2. 若出现 targetSdkVersion 弹窗,选择“Set manually”,将 targetSdkVersion 设为 20。

  3. 点击 File → Project Structure → Signing Configs,勾选 Automatically generate signature,登录华为账号后保存。

5.2 连接设备并运行

  • 模拟器:在 DevEco Studio 右上角 Device Manager 中创建并启动 Phone 模拟器(API 20)。

项目根目录终端执行以下命令:

flutter devices   # 确认鸿蒙设备已识别
flutter run

编译完成后,应用将自动安装并启动。在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5.3 功能验证清单

测试场景 预期效果 技术验证点
打开应用 输入框自动获取焦点,无边框,纯白/黑背景 UI 渲染正确,autofocus 生效
输入任意文字 右上角出现清空按钮(垃圾箱图标) provider 状态管理、条件渲染
关闭应用后重新打开 上次输入的内容自动恢复显示 shared_preferences 本地持久化
点击清空按钮 输入框内容清空,清空按钮消失 模型更新、UI 联动
切换系统深色模式 文字颜色自动适配为白色/黑色 主题感知、Material 3

六、常见问题与排查指南

6.1 flutter \-\-version 显示 0\.0\.0\-unknown

原因:鸿蒙版 SDK 缺少版本信息文件。
解决:在 flutter\_flutter\\bin\\cache 下创建 flutter\.version\.json,填入以下内容:

{
    "frameworkVersion": "3.27.5-ohos-1.0.0",
    "channel": "[user-branch]",
    "flutterVersion": "3.27.5-ohos-1.0.0"
}

6.2 构建时报 SDK component missingInvalid value of \&\#39;DEVECO\_SDK\_HOME\&\#39;

原因:环境变量 DEVECO\_SDK\_HOME 指向错误路径或与 HOS\_SDK\_HOME 冲突。
解决:删除系统变量中的 DEVECO\_SDK\_HOME,仅保留 HOS\_SDK\_HOME 并指向正确的鸿蒙 SDK 根目录,执行 flutter config \-\-ohos\-sdk=\&\#34;你的路径\&\#34; 后清理项目缓存。

6.3 运行后白屏或无法热重载

原因:首次编译缓存问题或连接不稳定。
解决:终端按 R 热重载,或按 q 退出后重新 flutter run;仍无效可执行 flutter clean 后再次运行。

七、总结与展望

通过本实战,你已完成以下关键任务:

  • ✅ 在鸿蒙 6.0 环境下成功创建并运行 Flutter 应用

  • ✅ 集成两个已适配鸿蒙的三方库(provider + shared_preferences)

  • ✅ 实践 ChangeNotifier 状态管理模式和本地持久化方案

  • ✅ 理解 Flutter 在鸿蒙平台上的 UI 渲染与设备适配要点

Logo

一站式 AI 云服务平台

更多推荐