Flutter+开源鸿蒙实战|智联邻里Day2 首页UI开发+全局组件封装+鸿蒙多端适配

Flutter+开源鸿蒙实战|智联邻里Day2 首页UI开发+全局组件封装+鸿蒙多端适配

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

摘要

本文承接Day1基础,聚焦「智联邻里」智慧社区项目Day2核心开发,全程围绕Flutter技术栈,落地"首页UI开发、全局组件封装、鸿蒙多端适配、基础路由配置"四大核心版块。全程口语化讲解、代码精简(每块仅5-6行核心代码),零基础友好,严格贴合十五五智慧社区民生导向,适配鸿蒙手机、平板、DAYU200开发板,同时兼顾适老化设计,完成首页从"空白"到"可用、美观、适配"的落地,为后续功能开发筑牢UI与组件基础。

html 复制代码
<!-- Schema.org 结构化数据 -->
<script type="application/ld+json">
{
  "@context":"https://schema.org",
  "@type":"BlogPosting",
  "headline":"Flutter+开源鸿蒙实战 智联邻里Day2 首页UI+全局组件+鸿蒙适配",
  "author":{"@type":"Person","name":"鸿蒙跨端开发者"},
  "publisher":{"@type":"Organization","name":"CSDN开源鸿蒙跨平台社区"},
  "datePublished":"2026-05-03",
  "description":"智联邻里Day2:Flutter首页UI开发、适老化全局组件封装、鸿蒙多端适配(手机/平板/开发板)、路由配置,代码精简、讲解详细,贴合十五五智慧社区需求",
  "keywords":"开源鸿蒙,OpenHarmony,Flutter,智联邻里Day2,Flutter首页UI,全局组件封装,鸿蒙多端适配,适老化组件"
}
</script>

一、前言(连贯衔接,明确今日目标)

哈喽小伙伴们,Day2来啦!昨天我们已经搞定了Flutter项目搭建、鸿蒙环境适配和目录规划,今天咱们正式进入「UI开发阶段」------这是项目的"脸面",也是用户第一眼看到的内容,尤其要贴合智慧社区"温暖、便捷、适老"的调性,同时适配鸿蒙多设备。

今天咱们不搞复杂逻辑,全程围绕Flutter技术,重点做4件事,全部衔接Day1的基础配置,不脱节、不做无用功:

  1. 开发首页核心UI(贴合智慧社区,包含四大核心入口,适配鸿蒙多端);
  2. 封装3个全局通用组件(适老化按钮、鸿蒙适配输入框、社区公告卡片),后续全项目复用;
  3. 优化鸿蒙多端适配细节(文字、布局、触控区域),解决Day1遗留的适配小问题;
  4. 配置基础路由,实现首页与后续页面的跳转铺垫,确保页面交互流畅。

依旧遵守咱们的老规矩:口语化讲解、多版块拆分、代码精简(每块仅5-6行核心代码)、全程聚焦Flutter+鸿蒙适配,兼顾适老化和十五五民生导向,让新手也能跟着一步步敲代码,今天咱们一起把「智联邻里」的"脸面"做精致!

二、Day2 今日核心开发目标(清晰可落地,聚焦Flutter)

  1. 完成首页UI布局开发,包含顶部导航栏、核心功能入口、社区公告、便民提示4大模块,贴合智慧社区调性;
  2. 封装3个全局通用Flutter组件(适老化按钮、鸿蒙适配输入框、公告卡片),支持多端复用、样式统一;
  3. 优化鸿蒙多端适配(手机/平板/DAYU200开发板),确保首页布局协调、文字清晰、触控灵敏;
  4. 配置Flutter路由管理基础,实现首页跳转至其他页面的基础逻辑,为后续功能衔接铺垫;
  5. 对接Day1的全局主题和屏幕适配,确保首页样式与全局风格统一,贴合适老化和鸿蒙适配要求。

三、版块1:首页UI开发(Flutter核心,代码极简)

首页是项目的"门面",咱们的设计原则是:简约、便捷、适老、适配鸿蒙多端,重点突出"政务服务、邻里互动、物业报修、便民服务"四大核心入口,同时添加社区公告、便民提示模块,贴合十五五"便民惠民"导向。

3.1 首页布局整体规划(Flutter布局逻辑)

首页采用"垂直布局+网格布局"结合的方式,适配鸿蒙多设备,结构清晰,重点模块突出,具体布局如下(对应Flutter代码逻辑):

  1. 顶部:自定义导航栏(带社区名称、返回按钮,适配鸿蒙状态栏);
  2. 中间:四大核心功能入口(网格布局,适配大屏/小屏,触控区域放大);
  3. 下方:社区公告卡片(横向滚动,展示最新社区通知);
  4. 底部:便民提示(适老化文字,提示物业费缴纳、设施报修入口)。

3.2 核心代码(Flutter布局,仅5-6行重点)

新建lib/pages/home_page.dart,编写首页核心布局,复用Day1的屏幕适配和全局主题,代码极简,重点讲解布局逻辑:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:zhilian_linli/widgets/custom_button.dart'; // 后续封装的组件

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

  @override
  Widget build(BuildContext context) {
    // 鸿蒙多端适配:判断是否为大屏(平板/开发板)
    final isLargeScreen = MediaQuery.of(context).size.width >= 600;
    return Scaffold(
      // 顶部导航栏(适配鸿蒙状态栏,文字放大)
      appBar: AppBar(
        title: Text("智联邻里社区", style: TextStyle(fontSize: isLargeScreen ? 18.sp : 16.sp)),
        centerTitle: true,
      ),
      // 核心内容区(垂直布局,适配滚动)
      body: SingleChildScrollView(
        child: Column(children: [
          // 四大功能入口(网格布局,大屏3列,小屏2列)
          GridView.count(
            shrinkWrap: true,
            crossAxisCount: isLargeScreen ? 3 : 2,
            padding: EdgeInsets.all(16.w),
            childAspectRatio: 1.2,
            children: [/* 功能入口按钮,后续对接组件 */],
          ),
        ]),
      ),
    );
  }
}

3.3 首页适配重点(贴合鸿蒙多设备)

  1. 布局适配:使用GridViewSingleChildScrollView,大屏(平板/DAYU200)显示3列功能入口,小屏(手机)显示2列,避免布局拥挤或空洞;
  2. 文字适配:通过isLargeScreen判断设备尺寸,自动调整文字大小,确保鸿蒙开发板/平板上文字清晰可见;
  3. 触控适配:功能入口按钮触控区域放大(最小尺寸48.w×48.h),适配鸿蒙开发板触控不灵敏的问题,尤其方便老年人操作。

四、版块2:全局通用组件封装(Flutter复用核心,3个组件)

组件封装是Flutter开发的核心技巧,今天我们封装3个最常用的全局组件,后续所有页面直接复用,减少重复开发,同时统一样式,贴合适老化和鸿蒙适配要求,每一个组件仅保留5-6行核心代码。

4.1 组件1:适老化自定义按钮(核心组件,适配鸿蒙)

新建lib/widgets/custom_button.dart,封装适老化按钮,放大触控区域、加粗文字、优化点击反馈,适配鸿蒙多设备:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

// 适老化自定义按钮(鸿蒙多端适配)
class CustomButton extends StatelessWidget {
  final String text;
  final VoidCallback onTap;

  const CustomButton({super.key, required this.text, required this.onTap});

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onTap,
      child: Container(
        width: double.infinity,
        height: 56.h, // 放大高度,提升触控体验
        alignment: Alignment.center,
        decoration: BoxDecoration(color: Color(0xFF2E8B57), borderRadius: BorderRadius.circular(8.r)),
        child: Text(text, style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold, color: Colors.white)),
      ),
    );
  }
}

4.2 组件2:鸿蒙适配输入框(预留后续功能,适老化)

新建lib/widgets/custom_input.dart,封装适配鸿蒙的输入框,放大输入区域、加粗提示文字,避免老年人看不清,核心代码:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

// 鸿蒙适配输入框(适老化,预留后续登录/搜索功能)
class CustomInput extends StatelessWidget {
  final String hintText;
  final TextEditingController? controller;

  const CustomInput({super.key, required this.hintText, this.controller});

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: controller,
      style: TextStyle(fontSize: 15.sp),
      decoration: InputDecoration(
        hintText: hintText,
        hintStyle: TextStyle(fontSize: 14.sp, color: Colors.grey),
        contentPadding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 18.h),
        border: OutlineInputBorder(borderRadius: BorderRadius.circular(8.r)),
      ),
    );
  }
}

4.3 组件3:社区公告卡片(首页核心组件)

新建lib/widgets/notice_card.dart,封装社区公告卡片,横向滚动、文字清晰,适配鸿蒙多端,核心代码:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

// 社区公告卡片(适配鸿蒙多端,横向滚动)
class NoticeCard extends StatelessWidget {
  final String title;
  final String content;

  const NoticeCard({super.key, required this.title, required this.content});

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 280.w,
      margin: EdgeInsets.only(right: 12.w),
      padding: EdgeInsets.all(16.w),
      decoration: BoxDecoration(border: Border.all(color: Colors.grey[200]), borderRadius: BorderRadius.circular(8.r)),
      child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
        Text(title, style: TextStyle(fontSize: 15.sp, fontWeight: FontWeight.bold)),
        SizedBox(height: 8.h),
        Text(content, style: TextStyle(fontSize: 13.sp, color: Colors.grey[600]), maxLines: 2, overflow: TextOverflow.ellipsis),
      ]),
    );
  }
}

4.4 组件复用说明(Flutter实战重点)

  1. 所有组件均适配flutter_screenutil,自动适配鸿蒙手机、平板、DAYU200开发板的尺寸;
  2. 组件样式与Day1定义的全局主题统一(主色调墨绿色),保持项目风格一致;
  3. 后续开发登录页、事务办理页时,直接导入这3个组件,无需重复编写代码,提升开发效率,契合十五五"集约高效"导向。

五、版块3:首页组件组装(Flutter布局整合,代码精简)

将上面封装的3个组件,整合到首页布局中,完成首页完整UI,核心代码仅保留关键片段,直接复制即可使用:

dart 复制代码
// 首页四大功能入口(整合CustomButton组件)
GridView.count(
  shrinkWrap: true,
  crossAxisCount: isLargeScreen ? 3 : 2,
  padding: EdgeInsets.all(16.w),
  childAspectRatio: 1.2,
  children: [
    CustomButton(text: "政务服务", onTap: () {}),
    CustomButton(text: "邻里互动", onTap: () {}),
    CustomButton(text: "物业报修", onTap: () {}),
    CustomButton(text: "便民服务", onTap: () {}),
  ],
),
// 社区公告区域(整合NoticeCard组件,横向滚动)
SizedBox(
  height: 120.h,
  child: ListView(
    scrollDirection: Axis.horizontal,
    padding: EdgeInsets.symmetric(horizontal: 16.w),
    children: [
      NoticeCard(title: "社区通知", content: "5月10日开展免费体检活动,请居民及时报名"),
      NoticeCard(title: "物业费提醒", content: "本月物业费已可缴纳,线上缴纳立减5元"),
    ],
  ),
),

组装后效果(贴合鸿蒙多端)

  1. 鸿蒙手机端:2列功能入口,公告横向滚动,文字清晰,触控灵敏;
  2. 鸿蒙平板端:3列功能入口,充分利用大屏空间,布局协调;
  3. DAYU200开发板:按钮触控区域放大,文字加粗,适配开发板显示和触控特性,老年人也能轻松操作。

六、版块4:鸿蒙多端适配优化(重点补充,避坑)

承接Day1的鸿蒙适配基础,今天重点优化3个适配细节,解决Flutter项目在鸿蒙设备上的常见问题,确保多端运行流畅、显示协调。

6.1 触控区域优化(鸿蒙开发板重点)

针对Day1提到的"开发板触控不灵敏"问题,优化所有可点击组件的触控区域,核心代码(仅修改组件外层):

dart 复制代码
// 给所有可点击组件添加Padding,放大触控区域
GestureDetector(
  onTap: onTap,
  child: Padding(
    padding: EdgeInsets.all(8.w), // 放大触控区域
    child: Container(/* 原有组件内容 */),
  ),
),

6.2 平板布局优化(鸿蒙平板重点)

平板端首页布局优化,核心是充分利用大屏空间,避免布局空洞,核心代码(补充首页布局):

dart 复制代码
// 平板端新增侧边快捷入口(仅大屏显示)
if (isLargeScreen) {
  Row(children: [
    Expanded(child: /* 原有首页内容 */),
    Container(width: 80.w, child: /* 侧边快捷入口 */),
  ]);
}

6.3 状态栏适配升级(鸿蒙全设备)

适配鸿蒙设备的深色/浅色模式,避免状态栏文字与背景重叠,核心代码(修改main.dart):

dart 复制代码
// 鸿蒙状态栏适配(深色/浅色模式自动切换)
SystemChrome.setSystemUIOverlayStyle(
  MediaQuery.of(context).platformBrightness == Brightness.dark
      ? SystemUiOverlayStyle.light
      : SystemUiOverlayStyle.dark,
);

6.4 适配常见坑(Flutter+鸿蒙避坑)

  1. 坑1:平板端布局拥挤 → 解决方案:通过isLargeScreen判断设备尺寸,动态调整布局列数和边距;
  2. 坑2:开发板文字过小 → 解决方案:所有文字使用sp单位,通过flutter_screenutil自动放大;
  3. 坑3:按钮点击无反馈 → 解决方案:给CustomButton添加onTapDown事件,添加轻微缩放反馈(代码极简,不新增复杂逻辑)。

七、版块5:Flutter基础路由配置(页面跳转铺垫)

为了后续页面跳转(比如首页→事务办理页、首页→登录页),今天配置基础路由管理,统一管理所有页面,避免跳转混乱,核心代码仅5-6行:

7.1 新建路由管理文件

新建lib/routes/routes.dart,配置首页路由,核心代码:

dart 复制代码
import 'package:flutter/material.dart';
import 'package:zhilian_linli/pages/home_page.dart';

// Flutter路由管理(统一管理所有页面)
class Routes {
  // 首页路由
  static const String home = "/home";

  // 路由配置
  static Map<String, WidgetBuilder> routes = {
    home: (context) => const HomePage(),
  };
}

7.2 配置全局路由(修改main.dart)

修改Day1的main.dart,对接路由配置,核心代码(补充):

dart 复制代码
import 'package:zhilian_linli/routes/routes.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return ScreenUtilInit(
      designSize: const Size(375, 812),
      minTextAdapt: true,
      splitScreenMode: true,
      child: MaterialApp(
        title: '智联邻里',
        theme: appTheme(), // Day1配置的全局主题
        initialRoute: Routes.home, // 默认启动首页
        routes: Routes.routes, // 对接路由配置
      ),
    );
  }
}

路由说明(Flutter实战重点)

  1. 后续新增页面(如事务办理页、登录页),只需在routes.dart中添加路由配置,无需修改其他文件;
  2. 页面跳转时,直接使用Navigator.pushNamed(context, Routes.xxx),简洁高效,避免路由混乱;
  3. 适配鸿蒙多端,页面跳转动画将在后续优化,今天仅完成基础配置,为后续功能衔接铺垫。

八、版块6:今日效果测试(Flutter+鸿蒙实战必做)

开发完成后,在鸿蒙多设备上进行测试,确保功能正常、适配协调,测试重点如下:

  1. 鸿蒙手机端:首页布局正常、组件显示完整、按钮点击灵敏、文字清晰;
  2. 鸿蒙平板端:3列功能入口布局协调、侧边快捷入口正常显示、滚动流畅;
  3. DAYU200开发板:触控灵敏、文字放大清晰、页面无卡顿、状态栏显示正常;
  4. 组件复用测试:修改CustomButton的样式,首页所有按钮同步更新,确保复用正常。

测试避坑提醒

  1. 若开发板运行卡顿,关闭Flutter默认动画(在MaterialApp中添加theme: ThemeData(animationDuration: Duration.zero));
  2. 若平板端布局错乱,检查isLargeScreen的判断条件,调整网格布局的childAspectRatio
  3. 若组件显示异常,检查flutter_screenutil的初始化配置,确保designSize与设计图一致。

九、Day2 开发总结(复盘+衔接)

今天Day2,咱们聚焦Flutter技术栈,顺利完成了「智联邻里」首页UI开发和全局组件封装,全程衔接Day1的基础配置,没有脱节,核心成果总结如下:

  1. 完成了首页UI开发:采用Flutter布局组件,实现了导航栏、四大功能入口、社区公告、便民提示四大模块,贴合智慧社区调性和十五五民生导向;
  2. 封装了3个全局Flutter组件:适老化按钮、鸿蒙适配输入框、公告卡片,实现组件复用,减少重复开发,统一项目样式;
  3. 优化了鸿蒙多端适配:解决了触控不灵敏、文字过小、布局错乱等问题,确保首页在手机、平板、DAYU200开发板上正常运行;
  4. 配置了Flutter基础路由:统一管理页面跳转,为后续开发事务办理、邻里互动等页面做好铺垫;
  5. 完成了多设备测试:避开了Flutter+鸿蒙适配的常见坑,确保首页"可用、美观、适配、适老"。

核心提醒:今天的重点是"UI布局"和"组件封装",组件封装是Flutter开发的核心,后续所有页面都会复用今天封装的3个组件,一定要确保组件样式统一、适配鸿蒙多端;另外,首页的功能入口目前仅做UI,后续会逐步对接具体功能。

十、下期内容预告(Day3)

Day3我们将进入功能开发阶段,全程聚焦Flutter核心逻辑,衔接今天的UI和组件,重点落地3件事:

  1. 开发"政务服务"核心功能(Flutter网络请求基础,对接模拟政务接口);
  2. 实现社区公告数据渲染(本地模拟数据,适配横向滚动和多设备显示);
  3. 优化组件交互细节(按钮点击反馈、公告点击跳转、页面滚动动画),同时补充鸿蒙适配细节,让功能更流畅。
相关推荐
特立独行的猫a7 小时前
移植 vcpkg 到鸿蒙 PC:vcpkg-tool 交叉编译与实践手记
华为·harmonyos·vcpkg·鸿蒙pc·vcpkg-tool
911hzh8 小时前
Flutter 音视频通话集成实战:WebSocket 做信令,WebRTC 传音视频,附详细事件时序图
websocket·flutter·音视频
RWKV元始智能15 小时前
RWKV超并发项目教程,RWKV-LM训练提速40%
人工智能·rnn·深度学习·自然语言处理·开源
Hommy8816 小时前
【开源剪映小助手】API 接口文档
开源·github·aigc·视频剪辑自动化·剪映api
一粒黑子16 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
里欧跑得慢16 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web
码途漫谈16 小时前
Easy-Vibe开发篇阅读笔记(四)——前端开发之结合 Agent Skills 美化界面
人工智能·笔记·ai·开源·ai编程
nashane16 小时前
HarmonyOS Wi-Fi连接用户操作监听全解析:从系统弹框到Promise回调
华为·harmonyos·harmonyos 5
GitCode官方17 小时前
小米 MiMo‑V2.5 系列开源,正式入驻 AtomGit!旗舰模型完成全球多家主流芯⽚⼚商深度适配
开源·小米·atomgit