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

前言

作为鸿蒙新手开发者,入门Flutter跨端开发的核心是"掌握三方库集成+鸿蒙端适配"。本文将带大家从零搭建一个可直接运行在鸿蒙设备(模拟器/真机)的本地日志管理APP,全程聚焦具体项目实操,不堆砌冗余理论,每一步都有明确操作指引,每一行代码都有详细注释,确保新手能跟着做、做得出。

本项目核心目标:使用Flutter开发,集成3个高频实用三方库,完成鸿蒙端适配,实现"日志添加、日志查看、日志搜索、日志删除、本地持久化存储"核心功能,最终生成可安装、可交互的鸿蒙端APP,贴合鸿蒙开发场景,同时巩固Flutter三方库使用技巧。

项目核心关键词:Flutter、三方库、鸿蒙(全程围绕这三个词展开,所有操作均适配鸿蒙端,避开复杂逻辑,聚焦新手可落地的实操场景)

一、项目核心信息(新手必看)

1.1 项目名称

Flutter_Harmony_LogManager(鸿蒙端Flutter日志管理APP)

1.2 项目核心功能(新手易实现,无复杂逻辑)

  • 基础功能:添加日志(支持输入日志内容、选择日志类型)
  • 核心功能:查看所有本地日志(按时间倒序排列)
  • 实用功能:搜索日志(根据关键词筛选)、删除日志(单条删除/清空全部)
  • 持久化功能:日志数据本地存储,关闭APP后重新打开不丢失

1.3 本次集成的三方库(鸿蒙端全兼容,新手友好)

本项目拒绝复杂三方库,选用3个Flutter高频、轻量、鸿蒙完美兼容的三方库,覆盖"本地存储、UI组件、搜索功能",贴合项目需求且易上手:

  1. hive:轻量级本地数据库三方库(比shared_preferences更适合结构化数据存储,鸿蒙端无适配问题),用于存储日志数据(日志内容、日志类型、添加时间);
  2. flutter_svg:UI组件三方库,用于展示日志类型图标(如信息、警告、错误图标),让APP界面更美观,鸿蒙端渲染无异常;
  3. 原生TextField:使用Flutter原生TextField实现搜索功能(替代searchbar_2,避免兼容性问题),快速实现日志搜索功能,无需自己编写搜索逻辑,适配鸿蒙端输入交互。

1.4 开发环境要求(和鸿蒙开发环境兼容,新手可直接复用)

无需额外安装新环境,复用鸿蒙+Flutter基础环境即可,具体要求如下:

  • Flutter SDK:3.10.0及以上(确保支持鸿蒙端);
  • 鸿蒙开发环境:DevEco Studio 4.0及以上(已配置鸿蒙SDK,能启动鸿蒙模拟器/连接真机);
  • 开发工具:VS Code(推荐,操作更轻便)或Android Studio;
  • 前置准备:已开启Flutter鸿蒙支持(执行过flutter config --enable-harmonyos命令)。

二、鸿蒙+Flutter环境检查(新手必做,避免后续报错)

在开始项目前,先检查环境是否适配,确保Flutter能正常识别鸿蒙设备,步骤如下:

  1. 打开VS Code/终端,输入命令,检查Flutter环境:

    flutter doctor
    

    重点查看"HarmonyOS"相关提示,确保输出为【✓】,如下所示(无报错即正常):

    [✓] HarmonyOS (develop for HarmonyOS)
        • HarmonyOS SDK version: 11
        • HarmonyOS NDK version: 2.0.0
        • HarmonyOS Studio path: D:\DevEco Studio
    
  2. 若未检测到鸿蒙支持,执行以下命令开启(执行后重新检查环境):

    flutter config --enable-harmonyos
    
  3. 启动鸿蒙模拟器(DevEco Studio中操作):打开DevEco Studio → 点击"Tools"→"Device Manager"→ 选择一个鸿蒙模拟器(推荐Phone类型,如P50 Pro)→ 点击"Launch"启动,启动成功后,模拟器会自动显示在桌面。

  4. 终端输入命令,查看已连接的设备,确认鸿蒙模拟器被识别:

    flutter devices
    

    输出中会显示鸿蒙模拟器信息,类似:“127.0.0.1:5555 (mobile) • 127.0.0.1:5555 • ohos-x64 • Ohos OpenHarmony-6.0.0.47 (API 20)”,即识别成功。

三、创建Flutter鸿蒙项目(步骤详细,新手零失误)

本步骤将创建一个支持鸿蒙端的Flutter项目,全程使用命令行操作,简单易懂,步骤如下:

  1. 打开终端,进入项目存放目录,执行以下命令创建项目:

    flutter create flutter_harmony_demo
    cd flutter_harmony_demo
    
  2. 添加鸿蒙平台支持:

    flutter create --platforms=harmonyos .
    
  3. 创建完成后,项目目录结构如下:

    flutter_harmony_demo/
    ├── lib/
    │   └── main.dart          # 项目入口文件
    ├── ohos/                  # 鸿蒙平台代码
    ├── pubspec.yaml           # 项目配置文件
    └── ...
    

四、集成三方库(核心步骤,鸿蒙端适配关键)

本项目集成3个三方库(hive、flutter_svg、原生TextField),所有库均已验证鸿蒙端兼容,步骤分为"配置依赖→安装依赖→初始化配置",全程复制代码即可,无需手动修改。

4.1 配置三方库依赖(修改pubspec.yaml文件)

pubspec.yaml是Flutter项目的依赖配置文件,所有三方库都需要在这里配置,步骤如下:

打开pubspec.yaml文件,修改dependencies和dev_dependencies部分:

name: flutter_harmony_demo
description: "A new Flutter project."
publish_to: 'none'

version: 1.0.0+1

environment:
  sdk: ^3.6.2

dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.8
  hive: ^2.2.3
  hive_flutter: ^1.1.0
  flutter_svg: ^2.0.9

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_lints: ^5.0.0
  hive_generator: ^2.0.1
  build_runner: ^2.4.8

flutter:
  uses-material-design: true

  assets:
    - assets/icons/

依赖说明:

  • hivehive_flutter:本地数据库存储
  • flutter_svg:SVG图标渲染
  • hive_generatorbuild_runner:自动生成Hive适配器代码

4.2 安装三方库(终端执行命令)

配置完成后,需要执行命令下载并安装三方库,步骤如下:

flutter pub get

4.3 初始化三方库(鸿蒙端适配关键)

三方库安装完成后,需要进行简单初始化,确保在鸿蒙端能正常使用,重点初始化hive(本地数据库),步骤如下:

注意:鸿蒙端Hive初始化特殊处理

由于鸿蒙端path_provider插件可能未完全支持,需要使用Hive.init()替代Hive.initFlutter(),使用系统临时目录作为存储路径:

import 'dart:io';
import 'package:hive_flutter/hive_flutter.dart';

// 鸿蒙端适配的Hive初始化
final appDir = Directory.systemTemp.path;
Hive.init(appDir);

五、项目核心页面开发(完整代码+详细注释,新手可直接复制)

本项目分为2个核心页面:日志管理主页面(LogManagerPage)、添加日志页面(AddLogPage),所有页面均集成三方库功能,适配鸿蒙端交互和UI,步骤如下:

5.1 项目目录整理(先规范目录,避免代码混乱)

在lib目录下,创建"pages"和"models"文件夹,用于存放页面和数据模型,然后在对应文件夹下创建文件:

整理后,项目核心目录结构如下(新手可对照检查):

lib/
├── main.dart                    # 项目入口文件
├── models/                      # 数据模型文件夹
│   ├── log_model.dart           # 日志数据模型
│   └── log_model.g.dart         # 自动生成的模型代码
└── pages/                       # 页面文件夹
    ├── log_manager_page.dart    # 日志管理主页面
    └── add_log_page.dart        # 添加日志页面

5.2 编写数据模型(log_model.dart)

数据模型用于定义日志的数据结构,使用Hive注解实现本地存储:

import 'package:hive/hive.dart';

part 'log_model.g.dart';

(typeId: 0)
class LogModel extends HiveObject {
  (0)
  String logContent;

  (1)
  String logType;

  (2)
  String addTime;

  LogModel({
    required this.logContent,
    required this.logType,
    required this.addTime,
  });
}

代码说明:

  • @HiveType(typeId: 0):Hive类型注解,每个模型需要唯一的typeId
  • @HiveField(0/1/2):字段注解,定义存储字段
  • extends HiveObject:继承HiveObject,获得Hive对象的方法

5.3 生成Hive适配器代码

数据模型编写完成后,需要运行build_runner生成适配器代码:

dart run build_runner build

生成成功后,会在models目录下生成log_model.g.dart文件。

5.4 编写添加日志页面(add_log_page.dart)

该页面用于添加日志,集成flutter_svg三方库展示图标,核心功能:输入日志内容、选择日志类型、点击保存按钮将日志存入本地数据库,代码如下(复制粘贴即可,注释详细):

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:hive/hive.dart';
import '../models/log_model.dart';

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

  
  State<AddLogPage> createState() => _AddLogPageState();
}

class _AddLogPageState extends State<AddLogPage> {
  // 1. 日志内容输入控制器(用于获取输入框内容)
  final TextEditingController _contentController = TextEditingController();
  // 2. 选中的日志类型(默认选中info,对应信息类型)
  String _selectedLogType = 'info';
  // 3. 获取Hive存储盒子(用于存储日志)
  final Box<LogModel> _logBox = Hive.box<LogModel>('logBox');

  // 保存日志(核心方法,调用hive三方库存储数据)
  void _saveLog() {
    // 获取输入的日志内容,去除空格
    String content = _contentController.text.trim();
    // 校验:日志内容不能为空
    if (content.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('请输入日志内容')),
      );
      return;
    }
    // 获取当前时间,作为日志添加时间(格式:年-月-日 时:分:秒)
    String addTime = DateTime.now().toString().split('.').first;
    // 创建日志模型对象
    LogModel log = LogModel(
      logContent: content,
      logType: _selectedLogType,
      addTime: addTime,
    );
    // 存入Hive本地数据库(鸿蒙端会自动持久化)
    _logBox.add(log);
    // 提示保存成功
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(content: Text('日志添加成功')),
    );
    // 清空输入框
    _contentController.clear();
    // 返回主页面
    Navigator.pop(context);
  }

  // 根据日志类型,返回对应的图标(集成flutter_svg三方库)
  Widget _getLogIcon(String type) {
    String iconPath = '';
    Color iconColor = Colors.grey;
    // 根据类型设置图标路径和颜色
    switch (type) {
      case 'info':
        iconPath = 'assets/icons/info.svg';
        iconColor = Colors.blue;
        break;
      case 'warning':
        iconPath = 'assets/icons/warning.svg';
        iconColor = Colors.orange;
        break;
      case 'error':
        iconPath = 'assets/icons/error.svg';
        iconColor = Colors.red;
        break;
    }
    // 使用flutter_svg展示svg图标(鸿蒙端完美渲染)
    return SvgPicture.asset(
      iconPath,
      width: 24,
      height: 24,
      colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn),
    );
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      // 鸿蒙端导航栏适配,避免状态栏遮挡
      appBar: AppBar(
        title: const Text('添加日志'),
        centerTitle: true,
        // 鸿蒙端导航栏返回按钮适配
        leading: IconButton(
          icon: const Icon(Icons.arrow_back),
          onPressed: () => Navigator.pop(context),
        ),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // 1. 日志类型选择(单选)
            const Text(
              '选择日志类型',
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
            ),
            const SizedBox(height: 12),
            // 日志类型选项(info/warning/error)
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                _buildLogTypeItem('info', '信息'),
                _buildLogTypeItem('warning', '警告'),
                _buildLogTypeItem('error', '错误'),
              ],
            ),
            const SizedBox(height: 20),
            // 2. 日志内容输入框
            const Text(
              '日志内容',
              style: TextStyle(fontSize: 16, fontWeight: FontWeight.w500),
            ),
            const SizedBox(height: 8),
            TextField(
              controller: _contentController,
              // 鸿蒙端输入框适配,支持多行输入
              maxLines: 5,
              decoration: const InputDecoration(
                border: OutlineInputBorder(),
                hintText: '请输入日志内容(如:鸿蒙端APP启动成功)',
                hintStyle: TextStyle(color: Colors.grey),
              ),
            ),
            const SizedBox(height: 30),
            // 3. 保存按钮(全屏宽度)
            SizedBox(
              width: double.infinity,
              child: ElevatedButton(
                onPressed: _saveLog,
                style: ElevatedButton.styleFrom(
                  padding: const EdgeInsets.symmetric(vertical: 16),
                ),
                child: const Text('保存日志', style: TextStyle(fontSize: 18)),
              ),
            ),
          ],
        ),
      ),
    );
  }

  // 构建日志类型选项(单选按钮)
  Widget _buildLogTypeItem(String type, String title) {
    return GestureDetector(
      onTap: () {
        // 点击切换选中的日志类型
        setState(() {
          _selectedLogType = type;
        });
      },
      child: Column(
        children: [
          // 日志类型图标(使用flutter_svg)
          _getLogIcon(type),
          const SizedBox(height: 8),
          // 日志类型标题
          Text(title),
          const SizedBox(height: 4),
          // 选中状态指示器(圆形)
          Container(
            width: 12,
            height: 12,
            decoration: BoxDecoration(
              shape: BoxShape.circle,
              // 选中状态为蓝色,未选中为灰色
              color: _selectedLogType == type ? Colors.blue : Colors.grey,
            ),
          ),
        ],
      ),
    );
  }
}

5.5 编写日志管理主页面(log_manager_page.dart)

该页面是项目核心页面,集成hive(本地存储)、原生TextField(搜索)、flutter_svg(图标)三个三方库,实现日志查看、搜索、删除功能,代码如下(复制粘贴即可,注释详细):

import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:flutter_svg/flutter_svg.dart';
import '../models/log_model.dart';
import 'add_log_page.dart';

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

  
  State<LogManagerPage> createState() => _LogManagerPageState();
}

class _LogManagerPageState extends State<LogManagerPage> {
  // 1. 获取Hive存储盒子(用于读取、删除日志)
  final Box<LogModel> _logBox = Hive.box<LogModel>('logBox');
  // 2. 搜索关键词(用于筛选日志)
  String _searchKeyword = '';

  // 删除单条日志(调用hive三方库)
  void _deleteSingleLog(int index) {
    // 弹出确认对话框(鸿蒙端适配)
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: const Text('确认删除'),
        content: const Text('确定要删除这条日志吗?删除后无法恢复'),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(context),
            child: const Text('取消'),
          ),
          TextButton(
            onPressed: () {
              // 从Hive中删除指定索引的日志
              _logBox.deleteAt(index);
              // 关闭对话框
              Navigator.pop(context);
              // 提示删除成功
              ScaffoldMessenger.of(context).showSnackBar(
                const SnackBar(content: Text('日志删除成功')),
              );
            },
            child: const Text('删除', style: TextStyle(color: Colors.red)),
          ),
        ],
      ),
    );
  }

  // 清空所有日志
  void _clearAllLogs() {
    if (_logBox.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('暂无日志可清空')),
      );
      return;
    }
    // 弹出确认对话框
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: const Text('确认清空'),
        content: const Text('确定要清空所有日志吗?清空后无法恢复'),
        actions: [
          TextButton(
            onPressed: () => Navigator.pop(context),
            child: const Text('取消'),
          ),
          TextButton(
            onPressed: () {
              // 清空Hive中的所有日志
              _logBox.clear();
              Navigator.pop(context);
              ScaffoldMessenger.of(context).showSnackBar(
                const SnackBar(content: Text('所有日志已清空')),
              );
            },
            child: const Text('清空', style: TextStyle(color: Colors.red)),
          ),
        ],
      ),
    );
  }

  // 根据日志类型,返回对应的图标和颜色(集成flutter_svg)
  Widget _getLogIconAndColor(String type) {
    String iconPath = '';
    Color iconColor = Colors.grey;
    switch (type) {
      case 'info':
        iconPath = 'assets/icons/info.svg';
        iconColor = Colors.blue;
        break;
      case 'warning':
        iconPath = 'assets/icons/warning.svg';
        iconColor = Colors.orange;
        break;
      case 'error':
        iconPath = 'assets/icons/error.svg';
        iconColor = Colors.red;
        break;
    }
    return SvgPicture.asset(
      iconPath,
      width: 28,
      height: 28,
      colorFilter: ColorFilter.mode(iconColor, BlendMode.srcIn),
    );
  }

  // 获取日志类型标题
  String _getLogTypeTitle(String type) {
    switch (type) {
      case 'info':
        return '信息';
      case 'warning':
        return '警告';
      case 'error':
        return '错误';
      default:
        return '未知';
    }
  }

  // 根据搜索关键词,筛选日志列表
  List<LogModel> _filterLogs(List<LogModel> allLogs) {
    if (_searchKeyword.isEmpty) {
      // 无搜索关键词,返回所有日志(按时间倒序排列,最新的在最前面)
      return allLogs.reversed.toList();
    } else {
      // 有搜索关键词,筛选包含关键词的日志
      return allLogs
          .where((log) => log.logContent.contains(_searchKeyword))
          .toList()
          .reversed
          .toList();
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter鸿蒙日志管理APP'),
        centerTitle: true,
        // 右上角清空按钮
        actions: [
          IconButton(
            icon: const Icon(Icons.delete_sweep),
            onPressed: _clearAllLogs,
            tooltip: '清空所有日志',
          ),
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            // 1. 搜索框(使用原生TextField,鸿蒙端完美适配)
            TextField(
              decoration: InputDecoration(
                hintText: '搜索日志内容...',
                prefixIcon: const Icon(Icons.search),
                suffixIcon: _searchKeyword.isNotEmpty
                    ? IconButton(
                        icon: const Icon(Icons.clear),
                        onPressed: () {
                          setState(() {
                            _searchKeyword = '';
                          });
                        },
                      )
                    : null,
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(12),
                ),
                filled: true,
                fillColor: Colors.grey[100],
                contentPadding: const EdgeInsets.symmetric(vertical: 0),
              ),
              onChanged: (value) {
                setState(() {
                  _searchKeyword = value;
                });
              },
            ),
            const SizedBox(height: 16),
            // 2. 日志列表(使用Hive监听数据变化,数据更新时自动刷新)
            Expanded(
              child: ValueListenableBuilder<Box<LogModel>>(
                // 监听Hive盒子的数据变化
                valueListenable: _logBox.listenable(),
                builder: (context, box, child) {
                  // 获取所有日志
                  List<LogModel> allLogs = box.values.toList();
                  // 根据搜索关键词筛选日志
                  List<LogModel> filteredLogs = _filterLogs(allLogs);

                  // 无日志时显示的提示
                  if (filteredLogs.isEmpty) {
                    return Center(
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          const Icon(Icons.note_add, size: 60, color: Colors.grey),
                          const SizedBox(height: 16),
                          Text(
                            _searchKeyword.isEmpty
                                ? '暂无日志,点击右下角添加'
                                : '未找到包含「' + _searchKeyword + '」的日志',
                            style: const TextStyle(fontSize: 16, color: Colors.grey),
                          ),
                        ],
                      ),
                    );
                  }

                  // 有日志时显示列表
                  return ListView.builder(
                    itemCount: filteredLogs.length,
                    itemBuilder: (context, index) {
                      LogModel log = filteredLogs[index];
                      // 获取原始索引(用于删除)
                      int originalIndex = allLogs.indexOf(log);
                      return Card(
                        margin: const EdgeInsets.only(bottom: 12),
                        child: ListTile(
                          // 左侧图标(使用flutter_svg)
                          leading: _getLogIconAndColor(log.logType),
                          // 日志内容
                          title: Text(
                            log.logContent,
                            maxLines: 2,
                            overflow: TextOverflow.ellipsis,
                          ),
                          // 日志类型和时间
                          subtitle: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Text(
                                '类型: ' + _getLogTypeTitle(log.logType),
                                style: const TextStyle(fontSize: 12, color: Colors.grey),
                              ),
                              Text(
                                '时间: ' + log.addTime,
                                style: const TextStyle(fontSize: 12, color: Colors.grey),
                              ),
                            ],
                          ),
                          // 右侧删除按钮
                          trailing: IconButton(
                            icon: const Icon(Icons.delete_outline, color: Colors.red),
                            onPressed: () => _deleteSingleLog(originalIndex),
                          ),
                        ),
                      );
                    },
                  );
                },
              ),
            ),
          ],
        ),
      ),
      // 右下角添加按钮
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => const AddLogPage()),
          );
        },
        tooltip: '添加日志',
        child: const Icon(Icons.add),
      ),
    );
  }
}

代码说明:

  • ValueListenableBuilder:监听Hive数据变化,自动刷新UI
  • TextField:原生搜索框,替代searchbar_2,鸿蒙端完美适配
  • SvgPicture.asset:使用flutter_svg渲染SVG图标
  • _filterLogs:根据关键词筛选日志列表

5.6 编写项目入口文件(main.dart)

main.dart是项目的入口文件,负责初始化Hive和启动应用:

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'models/log_model.dart';
import 'pages/log_manager_page.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  try {
    // 鸿蒙端适配:使用系统临时目录初始化Hive
    final appDir = Directory.systemTemp.path;
    Hive.init(appDir);
    // 注册Hive适配器
    Hive.registerAdapter(LogModelAdapter());
    // 打开Hive存储盒子
    await Hive.openBox<LogModel>('logBox');
    runApp(const MyApp());
  } catch (e) {
    debugPrint('Hive init error: ' + e.toString());
    runApp(MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text('初始化错误: ' + e.toString()),
        ),
      ),
    ));
  }
}

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

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter鸿蒙日志管理APP',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const LogManagerPage(),
    );
  }
}

代码说明:

  • Hive.init(appDir):鸿蒙端适配,使用系统临时目录替代path_provider
  • Hive.registerAdapter:注册数据模型适配器
  • Hive.openBox:打开Hive存储盒子

六、添加SVG图标资源

项目使用flutter_svg展示日志类型图标,需要添加SVG图标文件:

  1. 在项目根目录创建assets/icons/文件夹
  2. 在文件夹中添加三个SVG图标文件:
    • info.svg:信息图标
    • warning.svg:警告图标
    • error.svg:错误图标

info.svg示例代码:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
  <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/>
</svg>

warning.svg示例代码:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
  <path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z"/>
</svg>

error.svg示例代码:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
  <path d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"/>
</svg>

七、运行项目(鸿蒙端)

所有代码编写完成后,即可运行项目到鸿蒙设备:

7.1 运行到鸿蒙模拟器

  1. 确保鸿蒙模拟器已启动
  2. 终端执行命令查看设备:
    flutter devices
    
  3. 运行项目:
    flutter run -d 127.0.0.1:5555
    
    (设备ID根据实际情况替换)

7.2 热重载

运行成功后,修改代码后按r键进行热重载,快速查看修改效果。

八、项目总结

本项目成功实现了:

  • ✅ Flutter项目创建与鸿蒙平台适配
  • ✅ Hive本地数据库集成与鸿蒙端适配
  • ✅ flutter_svg图标渲染
  • ✅ 原生TextField搜索功能实现
  • ✅ 日志添加、查看、搜索、删除功能
  • ✅ 本地数据持久化存储

鸿蒙端适配要点总结:

  1. Hive初始化使用Hive.init(Directory.systemTemp.path)替代Hive.initFlutter()
  2. 使用原生TextField替代searchbar_2,避免兼容性问题
  3. SvgPicture使用colorFilter参数设置颜色

通过本项目,新手可以掌握Flutter三方库集成、鸿蒙端适配、本地数据存储等核心技能,为后续开发更复杂的鸿蒙应用打下基础。
请添加图片描述

Logo

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

更多推荐