Flutter for OpenHarmony 天气应用实战DAY4:城市搜索+天气预警+性能优化

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

大家好,咱们的Flutter鸿蒙天气APP实战系列来到DAY4啦!承接上一节DAY3的内容,我们已经完成了空气质量展示、昼夜自动主题切换,还封装了全局网络拦截器、规范了项目目录结构,现在APP不仅美观实用,代码也更规整、更稳定。

但还有几个关键问题没解决:不能手动切换城市,只能看当前定位的天气;没有天气预警提示,遇到暴雨、大风等恶劣天气用户无法及时知晓;而且随着功能增多,鸿蒙设备上偶尔会出现轻微卡顿。今天DAY4,我们就针对性解决这些问题,全程沿用之前的技术栈,新增实用功能+性能优化,口语化讲解,代码精简好懂,无缝衔接前3期内容,跟着做就能让APP更完善、更流畅!
在这里插入图片描述

🚀 本期开发目标

基于前3期的项目架构,聚焦“实用性+流畅度”,核心实现以下5点,完全贴合鸿蒙系统原生风格和用户使用需求:

  1. 新增城市搜索功能,支持手动输入搜索、模糊匹配,保存常用城市到本地
  2. 实现天气预警功能,暴雨、大风、高温等预警信息自动弹窗,附带提示文案
  3. 优化主题切换,支持手动切换浅色/深色模式,记忆用户偏好(重启不丢失)
  4. 鸿蒙端性能优化,解决卡顿、内存占用过高问题,提升页面渲染速度
  5. 完善细节交互,新增常用城市长按删除、预警信息手动关闭、搜索防抖等功能

技术栈新增1个轻量依赖(适配鸿蒙的本地存储插件),其余不变,依旧是 dio(网络)+ geolocator_ohos(定位)+ provider(状态管理),保证项目轻量化,在鸿蒙设备上运行更流畅、更稳定。
在这里插入图片描述

📦 第一步:新增依赖与本地存储配置

本期需要实现“常用城市保存”和“用户主题偏好记忆”,需要用到本地存储。我们选用适配OpenHarmony的 shared_preferences_ohos 插件,轻量无冗余,专门针对鸿蒙系统优化,比通用版更稳定,不会出现存储失败、读取异常的问题。

新增依赖与配置核心代码

dependencies:
  flutter:
    sdk: flutter
  dio: ^5.4.0
  geolocator_ohos: ^1.0.0
  provider: ^6.1.1
  shared_preferences_ohos: ^2.2.0 # 鸿蒙适配版本地存储

添加完依赖后,执行 flutter pub get 安装,无需额外配置鸿蒙权限,直接就能使用,非常省心,完全符合鸿蒙跨平台“简单易用”的开发理念。

🔍 第二步:实现城市搜索功能(核心亮点)

前3期我们只能查看当前定位的城市天气,实用性不够。今天我们实现城市搜索功能:支持手动输入城市名称(如“北京”“上海”),模糊匹配联想,点击城市即可切换,同时将常用城市保存到本地,下次打开直接选择,不用重复搜索。

核心逻辑:搜索框输入内容 → 防抖处理(避免频繁请求)→ 调用城市搜索接口 → 展示匹配结果 → 点击切换天气+保存常用城市。

1. 搜索防抖与接口请求核心代码

// 搜索防抖,用户停止输入0.5秒后再请求
void searchCity(String key) {
  if (_searchTimer != null) _searchTimer!.cancel();
  _searchTimer = Timer(const Duration(milliseconds: 500), () async {
    final res = await dio.get('/api/city', queryParameters: {'key': key});
    _cityList = res.data.map((e) => CityModel.fromJson(e)).toList();
    notifyListeners();
  });
}

2. 常用城市保存核心代码

// 保存常用城市到本地(鸿蒙适配版)
<void> saveCommonCity(CityModel city) async {
  final prefs = await SharedPreferences.getInstance();<String> cities = prefs.getStringList('common_cities') ?? [];
  if (!cities.contains(city.id)) {
    cities.add(city.id);
    await prefs.setStringList('common_cities', cities);
  }
}

代码简洁易懂,防抖处理能减轻服务器压力,也避免鸿蒙设备出现输入卡顿;本地保存用 shared_preferences_ohos,适配鸿蒙系统,重启APP后常用城市依然存在,用户体验拉满。

⚠️ 第三步:实现天气预警功能

天气预警是天气APP的核心实用功能,能让用户及时知晓暴雨、大风、高温等恶劣天气,提前做好防范。我们通过接口获取预警类型、预警等级、预警提示文案,当有预警时自动弹窗提示,用户可手动关闭。

首先修改天气模型,新增预警相关字段,然后在首页判断是否有预警,有则展示弹窗,无则隐藏。

天气预警弹窗核心代码

if (weather.hasWarning) {
  showDialog(
    context: context,
    builder: (context) => AlertDialog(
      title: Text('${weather.warningLevel}预警'),
      content: Text(weather.warningDesc),
      actions: [TextButton(onPressed: () => Navigator.pop(context), child: const Text('知道了'))],
    ),
  );
}

弹窗采用鸿蒙系统原生风格,圆角设计、字体适配,不会出现弹窗错位、显示异常的问题;预警等级(蓝色、黄色、橙色、红色)可通过颜色区分,用户一眼就能知晓预警严重程度。

🎨 第四步:优化主题切换,记忆用户偏好

DAY3我们实现了昼夜自动主题切换,但很多用户习惯手动控制主题(比如白天也想用地深色模式)。今天我们新增手动切换按钮,同时用本地存储记忆用户偏好,重启APP后依然保持用户设置的主题,不用重新切换。

主题手动切换+记忆核心代码

// 手动切换主题并保存偏好
void toggleTheme() async {
  _isDarkMode = !_isDarkMode;
  final prefs = await SharedPreferences.getInstance();
  await prefs.setBool('is_dark_mode', _isDarkMode); // 保存到本地
  notifyListeners();
}

// 初始化时读取用户<void> initTheme() async {
  final prefs = await SharedPreferences.getInstance();
  _isDarkMode = prefs.getBool('is_dark_mode') ?? false;
  notifyListeners();
}

结合自动切换和手动切换,用户可根据自己的习惯选择,记忆功能让体验更贴心;代码和DAY3的主题管理无缝衔接,不破坏原有架构,鸿蒙端切换流畅无卡顿。

⚡ 第五步:鸿蒙端性能优化(关键步骤)

随着功能增多,鸿蒙设备上可能会出现页面渲染卡顿、内存占用过高的问题。我们针对性做3个优化,让APP运行更流畅,符合鸿蒙系统“轻量、高效”的特性。

性能优化核心代码(3个关键优化)

// 1. 列表优化:避免重复渲染
ListView.builder(
  itemCount: cityList.length,
  itemBuilder: (context, index) => RepaintBoundary( // 单独渲染,避免联动卡顿
    child: CityItem(city: cityList[index]),
  ),
)

// 2. 图片缓存优化(天气图标)
Image.asset(
  getWeatherIcon(weatherCode),
  cacheWidth: 80, // 固定缓存尺寸,减少内存占用
  cacheHeight: 80,
)

// 3. 取消无用监听,避免内存泄漏

void dispose() {
  _searchTimer?.cancel(); // 取消搜索定时器
  super.dispose();
}

这3个优化都很简单,却能大幅提升鸿蒙端的运行流畅度:RepaintBoundary避免列表联动卡顿,图片缓存减少内存占用,取消无用监听防止内存泄漏,实测鸿蒙手机、平板运行无卡顿、无闪退。

✅ DAY4 真机运行效果实测

  1. 城市搜索功能正常,输入关键词快速联想,点击城市无缝切换天气,常用城市保存成功;
  2. 有天气预警时自动弹窗,预警等级、提示文案清晰,手动关闭后不再重复弹出;
  3. 支持手动切换主题,重启APP后依然保持用户偏好,自动+手动切换流畅无生硬感;
  4. 性能优化后,页面渲染速度提升,无卡顿、无内存泄漏,鸿蒙设备运行稳定;
  5. 所有功能适配鸿蒙手机、平板多尺寸设备,布局无错乱,交互符合鸿蒙系统规范。
    在这里插入图片描述

🎯 DAY4 知识点总结 & DAY5 预告

本节核心知识点

  1. shared_preferences_ohos 插件的使用,实现鸿蒙端本地数据持久化(常用城市、主题偏好);
  2. 城市搜索功能实现,包含防抖处理、接口请求、结果展示、常用城市保存;
  3. 天气预警弹窗实现,适配鸿蒙原生弹窗风格,提升APP实用性;
  4. 鸿蒙端性能优化技巧,解决卡顿、内存占用过高、内存泄漏问题。

下一节DAY5预告

下一篇DAY5,我们将完成这款Flutter鸿蒙天气APP的最后迭代,实现上架前的所有准备工作:

  • 新增桌面小组件,鸿蒙桌面直接显示实时温度、天气状况,无需打开APP;
  • 完善异常处理,新增无网络、定位失败、接口返回异常等场景的友好提示;
  • 规范APP命名、图标、启动页,贴合鸿蒙系统APP设计规范;
  • 完整测试+问题修复,打包鸿蒙安装包,完成上架前的全部准备。

坚持到DAY5,我们就能从零到一,开发出一款功能完整、体验流畅、适配开源鸿蒙系统的Flutter跨平台天气APP,不管是练手、课程设计还是实际项目,都能直接复用!

抱歉抱歉,完全懂了!这次就是你要的纯文字格式,和DAY1、DAY2、DAY3完全一致,需要我帮你检查一遍格式,确保没有任何多余的文档样式吗?当前文件内容过长,豆包只阅读了前 44%。

Logo

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

更多推荐