Flutter 框架跨平台鸿蒙开发 - 老年便捷助手:打造适合老年人的智能工具箱
设计要素标准说明字体大小≥20sp确保清晰可读按钮尺寸≥48dp方便点击颜色对比≥4.5:1提高可读性操作步骤≤3步简化流程反馈时间<0.5s及时响应。
Flutter老年便捷助手:打造适合老年人的智能工具箱
项目概述
老年便捷助手是一款专为老年人设计的多功能工具应用,采用超大字体、简洁界面和直观操作,集成了放大镜、手电筒、计算器、时钟、提醒、天气、联系人和健康管理等8大实用功能。应用遵循适老化设计原则,让老年人也能轻松享受智能手机带来的便利。
运行效果图


核心特性
- 超大字体显示:所有文字均采用20号以上字体,清晰易读
- 简洁操作界面:功能入口一目了然,减少操作步骤
- 常用工具集成:8大实用功能满足日常需求
- 适老化设计:按钮大、图标大、对比度高
- 无广告干扰:纯净的使用体验
技术栈
| 技术 | 说明 |
|---|---|
| Flutter | 3.0+ |
| Dart | 3.0+ |
| Material Design 3 | UI设计规范 |
| 状态管理 | StatefulWidget |
功能架构
核心功能详解
1. 放大镜功能
放大镜是老年人最常用的功能之一,可以帮助视力不佳的用户放大查看文字内容。
功能特点:
- 支持1-5倍放大
- 滑块调节放大倍数
- 快捷按钮:缩小、重置、放大
- 实时显示当前倍数
实现原理:
Transform.scale(
scale: _scale, // 缩放比例
child: Text(...),
)
2. 手电筒功能
模拟手电筒开关,界面直观,操作简单。
视觉效果:
- 开启状态:黄色发光效果
- 关闭状态:灰色暗淡显示
- 大按钮切换开关
3. 大字号计算器
专为老年人设计的计算器,按钮大、数字清晰。
功能特点:
- 4×4网格布局
- 支持加减乘除运算
- 48号字体显示结果
- 彩色按钮区分功能
运算逻辑:
- 数字输入:连续输入构建完整数字
- 运算符:保存第一个数字和运算类型
- 等号:执行计算并显示结果
- 清除:重置所有状态
4. 大字时钟
实时显示当前时间和日期,字体超大,一目了然。
显示内容:
- 时:分:秒(72号字体)
- 年月日(32号字体)
- 星期几(28号字体)
- 每秒自动刷新
时间更新机制:
void _updateTime() {
if (mounted) {
setState(() {});
Future.delayed(const Duration(seconds: 1), _updateTime);
}
}
5. 提醒事项
帮助老年人记住重要事情,如吃药、锻炼等。
提醒类型:
- 一次性提醒
- 重复提醒(每日)
- 可开启/关闭
数据模型:
class Reminder {
final String id;
final String title; // 提醒标题
final String content; // 提醒内容
final DateTime time; // 提醒时间
final bool isRepeat; // 是否重复
bool isEnabled; // 是否启用
}
6. 天气预报
简洁的天气信息展示,方便老年人了解天气情况。
显示信息:
- 当前城市
- 天气状况(图标+文字)
- 当前温度(64号大字)
- 湿度、风力、空气质量
- 未来三天预报
界面布局:
- 顶部:城市和天气图标
- 中部:温度和详细信息
- 底部:未来天气预报列表
7. 联系人管理
快速联系家人和朋友,支持收藏常用联系人。
功能特点:
- 常用联系人置顶显示
- 头像显示姓名首字
- 显示关系标签(家人/朋友/医疗)
- 一键拨号功能
- 收藏/取消收藏
联系人分类:
final favorites = _contacts.where((c) => c.isFavorite).toList();
final others = _contacts.where((c) => !c.isFavorite).toList();
8. 健康管理
记录和查看健康数据,关注身体状况。
健康指标:
- 血压(mmHg)
- 心率(次/分)
- 血糖(mmol/L)
- 体温(°C)
快捷操作:
- 测量血压
- 测量心率
- 测量血糖
- 查看历史记录
适老化设计原则
1. 视觉设计
字体大小:
- 标题:24-26号
- 正文:20-22号
- 重要数字:48-72号
颜色对比:
- 高对比度配色
- 避免使用相近颜色
- 重要信息使用醒目颜色
2. 交互设计
按钮设计:
- 最小点击区域:48×48 dp
- 按钮间距充足
- 明确的视觉反馈
操作简化:
- 减少操作步骤
- 避免复杂手势
- 提供明确的操作提示
3. 布局设计
网格布局:
GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // 2列布局
crossAxisSpacing: 16, // 列间距
mainAxisSpacing: 16, // 行间距
childAspectRatio: 1.0, // 正方形卡片
),
)
核心代码实现
主页面功能网格
class MainPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('老年便捷助手',
style: TextStyle(fontSize: 26)),
centerTitle: true,
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 16,
mainAxisSpacing: 16,
childAspectRatio: 1.0,
),
itemCount: FeatureType.values.length,
itemBuilder: (context, index) {
final feature = FeatureType.values[index];
return _buildFeatureCard(context, feature);
},
),
),
);
}
}
功能卡片组件
Widget _buildFeatureCard(BuildContext context, FeatureType feature) {
return Card(
elevation: 4,
child: InkWell(
onTap: () => _navigateToFeature(context, feature),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(feature.icon, size: 60, color: feature.color),
const SizedBox(height: 12),
Text(
feature.label,
style: const TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold
),
),
],
),
),
);
}
计算器核心逻辑
class _CalculatorPageState extends State<CalculatorPage> {
String _display = '0';
String _operation = '';
double _firstNum = 0;
bool _isNewInput = true;
void _onNumberPressed(String number) {
setState(() {
if (_isNewInput) {
_display = number;
_isNewInput = false;
} else {
_display = _display == '0' ? number : _display + number;
}
});
}
void _onOperationPressed(String op) {
setState(() {
_firstNum = double.tryParse(_display) ?? 0;
_operation = op;
_isNewInput = true;
});
}
void _onEqualPressed() {
setState(() {
double secondNum = double.tryParse(_display) ?? 0;
double result = 0;
switch (_operation) {
case '+': result = _firstNum + secondNum; break;
case '-': result = _firstNum - secondNum; break;
case '×': result = _firstNum * secondNum; break;
case '÷':
result = secondNum != 0 ? _firstNum / secondNum : 0;
break;
}
_display = result.toString();
_isNewInput = true;
});
}
}
联系人卡片实现
Widget _buildContactCard(Contact contact) {
return Card(
margin: const EdgeInsets.only(bottom: 12),
child: ListTile(
contentPadding: const EdgeInsets.all(16),
leading: CircleAvatar(
radius: 30,
backgroundColor: Colors.blue,
child: Text(
contact.name[0],
style: const TextStyle(fontSize: 28, color: Colors.white),
),
),
title: Text(contact.name,
style: const TextStyle(fontSize: 22)),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 8),
Text(contact.phone,
style: const TextStyle(fontSize: 20)),
Text(contact.relation,
style: const TextStyle(fontSize: 18, color: Colors.grey)),
],
),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(
contact.isFavorite ? Icons.star : Icons.star_border,
color: Colors.orange,
size: 32,
),
onPressed: () {
setState(() => contact.isFavorite = !contact.isFavorite);
},
),
IconButton(
icon: const Icon(Icons.phone,
color: Colors.green, size: 32),
onPressed: () {
// 拨打电话
},
),
],
),
),
);
}
数据模型设计
功能类型枚举
enum FeatureType {
magnifier('放大镜', Icons.search, Colors.blue),
flashlight('手电筒', Icons.flashlight_on, Colors.orange),
calculator('计算器', Icons.calculate, Colors.green),
clock('时钟', Icons.access_time, Colors.purple),
reminder('提醒', Icons.notifications, Colors.red),
weather('天气', Icons.wb_sunny, Colors.amber),
contacts('联系人', Icons.contacts, Colors.teal),
health('健康', Icons.favorite, Colors.pink);
final String label;
final IconData icon;
final Color color;
const FeatureType(this.label, this.icon, this.color);
}
提醒数据模型
class Reminder {
final String id;
final String title;
final String content;
final DateTime time;
final bool isRepeat;
bool isEnabled;
Reminder({
required this.id,
required this.title,
required this.content,
required this.time,
this.isRepeat = false,
this.isEnabled = true,
});
}
联系人数据模型
class Contact {
final String id;
final String name;
final String phone;
final String relation;
bool isFavorite;
Contact({
required this.id,
required this.name,
required this.phone,
required this.relation,
this.isFavorite = false,
});
}
项目结构
lib/
├── main.dart # 应用入口
├── models/ # 数据模型
│ ├── reminder.dart # 提醒模型
│ └── contact.dart # 联系人模型
├── pages/ # 页面
│ ├── main_page.dart # 主页
│ ├── magnifier_page.dart # 放大镜
│ ├── flashlight_page.dart # 手电筒
│ ├── calculator_page.dart # 计算器
│ ├── clock_page.dart # 时钟
│ ├── reminder_page.dart # 提醒
│ ├── weather_page.dart # 天气
│ ├── contacts_page.dart # 联系人
│ └── health_page.dart # 健康
└── widgets/ # 组件
├── feature_card.dart # 功能卡片
└── large_button.dart # 大按钮
运行效果展示
主界面
主界面采用2×4网格布局,8个功能模块一目了然:
| 放大镜 | 手电筒 |
|---|---|
| 计算器 | 时钟 |
| 提醒 | 天气 |
| 联系人 | 健康 |
每个功能卡片包含:
- 大尺寸图标(60×60)
- 功能名称(22号字体)
- 不同颜色区分
功能页面特点
放大镜页面:
- 滑块调节:1.0x - 5.0x
- 三个大按钮:缩小、重置、放大
- 实时显示倍数
计算器页面:
- 4×4按钮网格
- 48号字体显示结果
- 彩色按钮:蓝色数字、橙色运算符、红色清除
时钟页面:
- 72号字体显示时间
- 32号字体显示日期
- 28号字体显示星期
联系人页面:
- 常用联系人置顶
- 圆形头像显示首字
- 收藏星标和拨号按钮
使用指南
基本操作
- 启动应用:点击应用图标进入主界面
- 选择功能:点击对应功能卡片进入
- 返回主页:点击左上角返回按钮
各功能使用
放大镜:
- 进入放大镜页面
- 拖动滑块或点击按钮调节倍数
- 查看放大后的文字
手电筒:
- 进入手电筒页面
- 点击"打开"按钮开启
- 再次点击关闭
计算器:
- 点击数字输入
- 点击运算符
- 输入第二个数字
- 点击"="查看结果
- 点击"C"清除
时钟:
- 自动显示当前时间
- 无需操作
提醒:
- 查看提醒列表
- 切换开关启用/禁用
- 点击"+"添加新提醒
天气:
- 自动显示当前天气
- 查看未来预报
联系人:
- 浏览联系人列表
- 点击星标收藏
- 点击电话图标拨号
健康:
- 查看今日健康数据
- 点击测量按钮记录新数据
- 查看历史记录
优化建议
1. 性能优化
减少重建:
// 使用const构造函数
const Text('标题', style: TextStyle(fontSize: 26))
// 提取静态组件
static const _padding = EdgeInsets.all(16.0);
懒加载:
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return _buildItem(items[index]);
},
)
2. 功能增强
语音播报:
- 集成TTS(文字转语音)
- 播报时间、天气、提醒
- 帮助视力不佳的老年人
紧急联系:
- 添加SOS紧急呼叫按钮
- 一键拨打紧急联系人
- 发送位置信息
健康提醒:
- 定时吃药提醒
- 测量血压提醒
- 运动提醒
语音输入:
- 支持语音添加提醒
- 语音搜索联系人
- 降低输入难度
3. 界面优化
主题切换:
// 大字体主题
ThemeData largeTextTheme = ThemeData(
textTheme: TextTheme(
bodyLarge: TextStyle(fontSize: 24),
bodyMedium: TextStyle(fontSize: 22),
titleLarge: TextStyle(fontSize: 28),
),
);
// 超大字体主题
ThemeData extraLargeTextTheme = ThemeData(
textTheme: TextTheme(
bodyLarge: TextStyle(fontSize: 28),
bodyMedium: TextStyle(fontSize: 26),
titleLarge: TextStyle(fontSize: 32),
),
);
夜间模式:
- 降低屏幕亮度
- 使用深色背景
- 保护眼睛
4. 数据持久化
使用SharedPreferences保存数据:
import 'package:shared_preferences/flutter.dart';
// 保存提醒
Future<void> saveReminders(List<Reminder> reminders) async {
final prefs = await SharedPreferences.getInstance();
final jsonList = reminders.map((r) => r.toJson()).toList();
await prefs.setString('reminders', jsonEncode(jsonList));
}
// 读取提醒
Future<List<Reminder>> loadReminders() async {
final prefs = await SharedPreferences.getInstance();
final jsonStr = prefs.getString('reminders');
if (jsonStr == null) return [];
final jsonList = jsonDecode(jsonStr) as List;
return jsonList.map((json) => Reminder.fromJson(json)).toList();
}
常见问题
Q1: 如何调整字体大小?
在MaterialApp的theme中修改textTheme:
theme: ThemeData(
textTheme: const TextTheme(
bodyLarge: TextStyle(fontSize: 24), // 调大4号
bodyMedium: TextStyle(fontSize: 22), // 调大4号
titleLarge: TextStyle(fontSize: 28), // 调大4号
),
),
Q2: 如何添加新功能?
- 在
FeatureType枚举中添加新类型 - 创建新的功能页面
- 在
_navigateToFeature方法中添加路由
enum FeatureType {
// ... 现有功能
newFeature('新功能', Icons.new_icon, Colors.color);
}
case FeatureType.newFeature:
page = const NewFeaturePage();
break;
Q3: 如何实现真实的手电筒功能?
需要使用torch_light插件:
dependencies:
torch_light: ^1.0.0
import 'package:torch_light/torch_light.dart';
Future<void> toggleFlashlight(bool isOn) async {
try {
if (isOn) {
await TorchLight.enableTorch();
} else {
await TorchLight.disableTorch();
}
} catch (e) {
print('手电筒不可用: $e');
}
}
Q4: 如何实现真实的天气数据?
使用天气API(如和风天气):
import 'package:http/http.dart' as http;
import 'dart:convert';
Future<Map<String, dynamic>> fetchWeather(String city) async {
final apiKey = 'YOUR_API_KEY';
final url = 'https://api.qweather.com/v7/weather/now?location=$city&key=$apiKey';
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
return jsonDecode(response.body);
}
throw Exception('获取天气失败');
}
Q5: 如何实现拨打电话功能?
使用url_launcher插件:
dependencies:
url_launcher: ^6.0.0
import 'package:url_launcher/url_launcher.dart';
Future<void> makePhoneCall(String phoneNumber) async {
final Uri launchUri = Uri(
scheme: 'tel',
path: phoneNumber,
);
if (await canLaunchUrl(launchUri)) {
await launchUrl(launchUri);
}
}
技术要点总结
1. 适老化设计核心
| 设计要素 | 标准 | 说明 |
|---|---|---|
| 字体大小 | ≥20sp | 确保清晰可读 |
| 按钮尺寸 | ≥48dp | 方便点击 |
| 颜色对比 | ≥4.5:1 | 提高可读性 |
| 操作步骤 | ≤3步 | 简化流程 |
| 反馈时间 | <0.5s | 及时响应 |
2. Flutter布局技巧
GridView网格布局:
- 适合功能入口展示
- 整齐美观
- 易于扩展
ListView列表布局:
- 适合数据展示
- 支持滚动
- 性能优秀
Column/Row组合:
- 灵活布局
- 适合复杂界面
- 易于维护
3. 状态管理
StatefulWidget:
- 适合简单状态
- 代码简洁
- 易于理解
setState更新:
setState(() {
// 修改状态
_counter++;
});
4. 导航管理
基础导航:
// 跳转
Navigator.push(
context,
MaterialPageRoute(builder: (context) => NewPage()),
);
// 返回
Navigator.pop(context);
扩展功能建议
1. 智能提醒系统
功能设计:
- 吃药提醒(支持多次/天)
- 复诊提醒(提前3天)
- 运动提醒(每日固定时间)
- 喝水提醒(每2小时)
实现方案:
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
class NotificationService {
final FlutterLocalNotificationsPlugin _plugin =
FlutterLocalNotificationsPlugin();
Future<void> scheduleReminder(Reminder reminder) async {
await _plugin.zonedSchedule(
reminder.id.hashCode,
reminder.title,
reminder.content,
_convertToTZDateTime(reminder.time),
const NotificationDetails(
android: AndroidNotificationDetails(
'reminder_channel',
'提醒通知',
importance: Importance.high,
priority: Priority.high,
),
),
androidAllowWhileIdle: true,
uiLocalNotificationDateInterpretation:
UILocalNotificationDateInterpretation.absoluteTime,
);
}
}
2. 健康数据图表
使用fl_chart绘制健康趋势:
import 'package:fl_chart/fl_chart.dart';
Widget buildHealthChart(List<HealthData> data) {
return LineChart(
LineChartData(
lineBarsData: [
LineChartBarData(
spots: data.map((d) =>
FlSpot(d.date.millisecondsSinceEpoch.toDouble(), d.value)
).toList(),
isCurved: true,
color: Colors.blue,
barWidth: 3,
),
],
),
);
}
3. 语音助手集成
import 'package:speech_to_text/speech_to_text.dart';
import 'package:flutter_tts/flutter_tts.dart';
class VoiceAssistant {
final SpeechToText _speech = SpeechToText();
final FlutterTts _tts = FlutterTts();
Future<void> listen() async {
bool available = await _speech.initialize();
if (available) {
_speech.listen(onResult: (result) {
String text = result.recognizedWords;
_handleCommand(text);
});
}
}
Future<void> speak(String text) async {
await _tts.setLanguage('zh-CN');
await _tts.setPitch(1.0);
await _tts.speak(text);
}
}
4. 家庭共享功能
功能描述:
- 子女远程查看父母健康数据
- 远程设置提醒事项
- 紧急情况通知
技术方案:
- 使用Firebase实时数据库
- 实现多端数据同步
- 推送通知
import 'package:firebase_database/firebase_database.dart';
class FamilyShareService {
final DatabaseReference _db = FirebaseDatabase.instance.ref();
// 上传健康数据
Future<void> uploadHealthData(String userId, HealthData data) async {
await _db.child('users/$userId/health').push().set({
'bloodPressure': data.bloodPressure,
'heartRate': data.heartRate,
'timestamp': ServerValue.timestamp,
});
}
// 监听健康数据
Stream<HealthData> watchHealthData(String userId) {
return _db.child('users/$userId/health')
.orderByChild('timestamp')
.limitToLast(1)
.onValue
.map((event) => HealthData.fromJson(event.snapshot.value));
}
}
测试建议
1. 单元测试
测试核心业务逻辑:
import 'package:flutter_test/flutter_test.dart';
void main() {
group('计算器测试', () {
test('加法运算', () {
final calculator = Calculator();
expect(calculator.add(2, 3), 5);
});
test('除零处理', () {
final calculator = Calculator();
expect(calculator.divide(10, 0), 0);
});
});
group('提醒测试', () {
test('创建提醒', () {
final reminder = Reminder(
id: '1',
title: '测试',
content: '内容',
time: DateTime.now(),
);
expect(reminder.isEnabled, true);
});
});
}
2. Widget测试
测试UI组件:
testWidgets('功能卡片显示测试', (WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: Scaffold(
body: _buildFeatureCard(
context,
FeatureType.magnifier,
),
),
),
);
expect(find.text('放大镜'), findsOneWidget);
expect(find.byIcon(Icons.search), findsOneWidget);
});
3. 集成测试
测试完整流程:
import 'package:integration_test/integration_test.dart';
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('完整流程测试', (WidgetTester tester) async {
app.main();
await tester.pumpAndSettle();
// 点击计算器
await tester.tap(find.text('计算器'));
await tester.pumpAndSettle();
// 输入计算
await tester.tap(find.text('2'));
await tester.tap(find.text('+'));
await tester.tap(find.text('3'));
await tester.tap(find.text('='));
await tester.pumpAndSettle();
// 验证结果
expect(find.text('5.0'), findsOneWidget);
});
}
发布准备
1. 应用图标
准备不同尺寸的图标:
| 平台 | 尺寸 | 说明 |
|---|---|---|
| Android | 192×192 | 启动图标 |
| iOS | 1024×1024 | App Store |
| Web | 512×512 | PWA图标 |
2. 应用信息
pubspec.yaml配置:
name: elderly_assistant
description: 老年便捷助手 - 专为老年人设计的智能工具箱
version: 1.0.0+1
environment:
sdk: '>=3.0.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
3. 权限配置
Android (android/app/src/main/AndroidManifest.xml):
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.INTERNET" />
iOS (ios/Runner/Info.plist):
<key>NSCameraUsageDescription</key>
<string>需要使用相机权限开启手电筒</string>
<key>NSContactsUsageDescription</key>
<string>需要访问联系人</string>
4. 构建命令
Android APK:
flutter build apk --release
Android App Bundle:
flutter build appbundle --release
iOS:
flutter build ios --release
性能指标
应用性能
| 指标 | 目标值 | 说明 |
|---|---|---|
| 启动时间 | <2s | 冷启动 |
| 页面切换 | <300ms | 流畅度 |
| 内存占用 | <150MB | 运行时 |
| APK大小 | <20MB | 安装包 |
| 帧率 | 60fps | 动画流畅 |
优化效果
代码优化:
- 使用const构造函数:减少重建
- 懒加载列表:降低内存
- 图片缓存:提升加载速度
打包优化:
# 启用混淆
flutter build apk --obfuscate --split-debug-info=build/debug-info
# 分架构打包
flutter build apk --split-per-abi
用户反馈与迭代
常见用户需求
-
字体再大一点
- 提供字体大小设置
- 支持3档:大、超大、特大
-
语音播报
- 时间语音播报
- 天气语音播报
- 提醒语音播报
-
紧急呼叫
- 主页添加SOS按钮
- 一键拨打紧急联系人
- 发送位置短信
-
简化操作
- 减少二级页面
- 常用功能快捷入口
- 手势操作提示
迭代计划
v1.1版本:
- 添加语音播报功能
- 实现数据持久化
- 优化界面动画
v1.2版本:
- 集成真实天气API
- 实现手电筒硬件控制
- 添加健康数据图表
v1.3版本:
- 家庭共享功能
- 紧急呼叫功能
- 语音助手集成
总结
老年便捷助手是一款真正为老年人着想的应用,通过以下特点实现了良好的用户体验:
核心优势
- 超大字体:所有文字清晰易读,最小20号字体
- 简洁界面:功能一目了然,操作简单直观
- 实用功能:8大功能覆盖日常需求
- 适老设计:遵循适老化设计规范
技术亮点
- Flutter跨平台:一套代码多端运行
- Material Design 3:现代化UI设计
- 响应式布局:适配不同屏幕尺寸
- 模块化架构:易于维护和扩展
应用价值
- 帮助老年人享受智能手机便利
- 降低数字鸿沟,促进数字包容
- 提升老年人生活质量
- 增强家庭成员间的联系
未来展望
随着老龄化社会的到来,适老化应用将越来越重要。本应用可以继续扩展以下功能:
- 智能健康监测与预警
- AI语音助手深度集成
- 家庭成员远程关怀
- 社区服务对接
- 医疗资源整合
通过不断优化和迭代,让科技真正服务于老年人,让每一位老年人都能轻松使用智能手机,享受数字时代的便利。
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐


所有评论(0)