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的基础配置,不脱节、不做无用功:
- 开发首页核心UI(贴合智慧社区,包含四大核心入口,适配鸿蒙多端);
- 封装3个全局通用组件(适老化按钮、鸿蒙适配输入框、社区公告卡片),后续全项目复用;
- 优化鸿蒙多端适配细节(文字、布局、触控区域),解决Day1遗留的适配小问题;
- 配置基础路由,实现首页与后续页面的跳转铺垫,确保页面交互流畅。
依旧遵守咱们的老规矩:口语化讲解、多版块拆分、代码精简(每块仅5-6行核心代码)、全程聚焦Flutter+鸿蒙适配,兼顾适老化和十五五民生导向,让新手也能跟着一步步敲代码,今天咱们一起把「智联邻里」的"脸面"做精致!

二、Day2 今日核心开发目标(清晰可落地,聚焦Flutter)
- 完成首页UI布局开发,包含顶部导航栏、核心功能入口、社区公告、便民提示4大模块,贴合智慧社区调性;
- 封装3个全局通用Flutter组件(适老化按钮、鸿蒙适配输入框、公告卡片),支持多端复用、样式统一;
- 优化鸿蒙多端适配(手机/平板/DAYU200开发板),确保首页布局协调、文字清晰、触控灵敏;
- 配置Flutter路由管理基础,实现首页跳转至其他页面的基础逻辑,为后续功能衔接铺垫;
- 对接Day1的全局主题和屏幕适配,确保首页样式与全局风格统一,贴合适老化和鸿蒙适配要求。
三、版块1:首页UI开发(Flutter核心,代码极简)
首页是项目的"门面",咱们的设计原则是:简约、便捷、适老、适配鸿蒙多端,重点突出"政务服务、邻里互动、物业报修、便民服务"四大核心入口,同时添加社区公告、便民提示模块,贴合十五五"便民惠民"导向。
3.1 首页布局整体规划(Flutter布局逻辑)
首页采用"垂直布局+网格布局"结合的方式,适配鸿蒙多设备,结构清晰,重点模块突出,具体布局如下(对应Flutter代码逻辑):
- 顶部:自定义导航栏(带社区名称、返回按钮,适配鸿蒙状态栏);
- 中间:四大核心功能入口(网格布局,适配大屏/小屏,触控区域放大);
- 下方:社区公告卡片(横向滚动,展示最新社区通知);
- 底部:便民提示(适老化文字,提示物业费缴纳、设施报修入口)。
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 首页适配重点(贴合鸿蒙多设备)
- 布局适配:使用
GridView和SingleChildScrollView,大屏(平板/DAYU200)显示3列功能入口,小屏(手机)显示2列,避免布局拥挤或空洞; - 文字适配:通过
isLargeScreen判断设备尺寸,自动调整文字大小,确保鸿蒙开发板/平板上文字清晰可见; - 触控适配:功能入口按钮触控区域放大(最小尺寸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实战重点)
- 所有组件均适配
flutter_screenutil,自动适配鸿蒙手机、平板、DAYU200开发板的尺寸; - 组件样式与Day1定义的全局主题统一(主色调墨绿色),保持项目风格一致;
- 后续开发登录页、事务办理页时,直接导入这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元"),
],
),
),
组装后效果(贴合鸿蒙多端)
- 鸿蒙手机端:2列功能入口,公告横向滚动,文字清晰,触控灵敏;
- 鸿蒙平板端: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:平板端布局拥挤 → 解决方案:通过
isLargeScreen判断设备尺寸,动态调整布局列数和边距; - 坑2:开发板文字过小 → 解决方案:所有文字使用
sp单位,通过flutter_screenutil自动放大; - 坑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实战重点)
- 后续新增页面(如事务办理页、登录页),只需在
routes.dart中添加路由配置,无需修改其他文件; - 页面跳转时,直接使用
Navigator.pushNamed(context, Routes.xxx),简洁高效,避免路由混乱; - 适配鸿蒙多端,页面跳转动画将在后续优化,今天仅完成基础配置,为后续功能衔接铺垫。

八、版块6:今日效果测试(Flutter+鸿蒙实战必做)
开发完成后,在鸿蒙多设备上进行测试,确保功能正常、适配协调,测试重点如下:
- 鸿蒙手机端:首页布局正常、组件显示完整、按钮点击灵敏、文字清晰;
- 鸿蒙平板端:3列功能入口布局协调、侧边快捷入口正常显示、滚动流畅;
- DAYU200开发板:触控灵敏、文字放大清晰、页面无卡顿、状态栏显示正常;
- 组件复用测试:修改
CustomButton的样式,首页所有按钮同步更新,确保复用正常。
测试避坑提醒
- 若开发板运行卡顿,关闭Flutter默认动画(在
MaterialApp中添加theme: ThemeData(animationDuration: Duration.zero)); - 若平板端布局错乱,检查
isLargeScreen的判断条件,调整网格布局的childAspectRatio; - 若组件显示异常,检查
flutter_screenutil的初始化配置,确保designSize与设计图一致。
九、Day2 开发总结(复盘+衔接)
今天Day2,咱们聚焦Flutter技术栈,顺利完成了「智联邻里」首页UI开发和全局组件封装,全程衔接Day1的基础配置,没有脱节,核心成果总结如下:
- 完成了首页UI开发:采用Flutter布局组件,实现了导航栏、四大功能入口、社区公告、便民提示四大模块,贴合智慧社区调性和十五五民生导向;
- 封装了3个全局Flutter组件:适老化按钮、鸿蒙适配输入框、公告卡片,实现组件复用,减少重复开发,统一项目样式;
- 优化了鸿蒙多端适配:解决了触控不灵敏、文字过小、布局错乱等问题,确保首页在手机、平板、DAYU200开发板上正常运行;
- 配置了Flutter基础路由:统一管理页面跳转,为后续开发事务办理、邻里互动等页面做好铺垫;
- 完成了多设备测试:避开了Flutter+鸿蒙适配的常见坑,确保首页"可用、美观、适配、适老"。
核心提醒:今天的重点是"UI布局"和"组件封装",组件封装是Flutter开发的核心,后续所有页面都会复用今天封装的3个组件,一定要确保组件样式统一、适配鸿蒙多端;另外,首页的功能入口目前仅做UI,后续会逐步对接具体功能。
十、下期内容预告(Day3)
Day3我们将进入功能开发阶段,全程聚焦Flutter核心逻辑,衔接今天的UI和组件,重点落地3件事:
- 开发"政务服务"核心功能(Flutter网络请求基础,对接模拟政务接口);
- 实现社区公告数据渲染(本地模拟数据,适配横向滚动和多设备显示);
- 优化组件交互细节(按钮点击反馈、公告点击跳转、页面滚动动画),同时补充鸿蒙适配细节,让功能更流畅。