最近接到一个智慧社区改造项目,需要为某小区开发一套基于Flutter和OpenHarmony的门禁管理系统。这个项目最有趣的地方在于需要同时兼顾移动端App和嵌入式设备的开发,还要处理业主投诉这类业务逻辑。经过两周的密集开发,我们成功实现了门禁控制、访客管理、投诉处理等核心功能模块。
这套系统主要解决三个痛点:
选择Flutter作为主要开发框架基于以下考量:
dart复制// 典型的主页架构示例
class MainPage extends StatefulWidget {
@override
_MainPageState createState() => _MainPageState();
}
class _MainPageState extends State<MainPage> {
// 门禁状态监听
StreamSubscription<DoorStatus>? _doorStatusSubscription;
@override
void initState() {
super.initState();
_initDoorController();
}
Future<void> _initDoorController() async {
_doorStatusSubscription = DoorService.statusStream.listen((status) {
// 更新UI状态
});
}
}
针对门禁主机这类OpenHarmony设备,我们开发了专门的硬件通信层:
重要提示:OpenHarmony设备开发需要特别注意权限声明,在config.json中必须明确定义:
json复制"reqPermissions": [ { "name": "ohos.permission.DISTRIBUTED_DATASYNC" } ]
门禁控制的核心流程包括:
我们采用状态机模式管理门禁状态:
dart复制enum DoorStatus {
locked,
unlocking,
unlocked,
error
}
class DoorController {
final BehaviorSubject<DoorStatus> _statusController = BehaviorSubject.seeded(DoorStatus.locked);
Future<void> unlock() async {
_statusController.add(DoorStatus.unlocking);
try {
await _sendUnlockCommand();
_statusController.add(DoorStatus.unlocked);
await Future.delayed(Duration(seconds: 5));
_statusController.add(DoorStatus.locked);
} catch (e) {
_statusController.addError(e);
}
}
}
投诉详情页的实现要点:
dart复制class ComplaintDetailPage extends StatelessWidget {
final Complaint complaint;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('投诉详情')),
body: Column(
children: [
_buildStatusIndicator(),
_buildContentSection(),
_buildImageGallery(),
_buildActionButtons(),
],
),
);
}
Widget _buildImageGallery() {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
itemBuilder: (ctx, index) => Image.network(complaint.images[index]),
);
}
}
针对投诉模块中的图片展示,我们实现了三级缓存策略:
dart复制class CachedImage extends StatelessWidget {
final String url;
@override
Widget build(BuildContext context) {
return FutureBuilder<Uint8List>(
future: _loadImage(url),
builder: (ctx, snapshot) {
if (snapshot.hasData) {
return Image.memory(snapshot.data!);
}
return Placeholder();
},
);
}
Future<Uint8List> _loadImage(String url) async {
// 1. 检查内存缓存
// 2. 检查本地缓存
// 3. 网络请求
}
}
采用BLoC模式实现状态管理:
| 模块 | 状态类 | 事件类 |
|---|---|---|
| 门禁 | DoorState | DoorEvent |
| 投诉 | ComplaintState | ComplaintEvent |
典型的事件处理流程:
dart复制class DoorBloc extends Bloc<DoorEvent, DoorState> {
@override
Stream<DoorState> mapEventToState(DoorEvent event) async* {
if (event is UnlockRequested) {
yield DoorState.unlocking();
try {
await _doorService.unlock();
yield DoorState.unlocked();
} catch (e) {
yield DoorState.error(e.toString());
}
}
}
}
现象:在弱网环境下设备经常掉线
解决方案:
dart复制class DoorConnection {
final _retryDelays = [1, 2, 4, 8, 16]; // 秒
Future<void> connect() async {
int attempt = 0;
while (attempt < _retryDelays.length) {
try {
await _tryConnect();
return;
} catch (e) {
await Future.delayed(Duration(seconds: _retryDelays[attempt]));
attempt++;
}
}
throw ConnectionFailedException();
}
}
性能问题:大量图片传输时出现卡顿
优化方案:
dart复制Future<Uint8List> _loadHighResImage(String path) async {
return await compute(_isolateLoadImage, path);
}
static Uint8List _isolateLoadImage(String path) {
// 在isolate中执行耗时操作
}
我们的CI/CD流程包含:
yaml复制# .github/workflows/build.yml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: subosito/flutter-action@v1
- run: flutter pub get
- run: flutter test --coverage
- run: bash <(curl -s https://codecov.io/bash)
实现的关键监控指标:
| 指标 | 采集方式 | 告警阈值 |
|---|---|---|
| 开门响应时间 | 端到端打点 | >1.5秒 |
| 图片加载耗时 | 拦截Image.network | >3秒 |
| 页面渲染帧率 | PerformanceOverlay | <50fps |
dart复制void _recordPerformance() {
FlutterFpsMonitor().addListener((fps) {
if (fps < 50) {
Analytics().log('low_fps', params: {'fps': fps});
}
});
}
这个项目让我深刻体会到跨平台开发的优势与挑战。Flutter+OpenHarmony的组合在物联网场景下展现出强大潜力,特别是在需要同时兼顾移动端和嵌入式设备的项目中。最大的收获是掌握了如何在不同架构的设备间建立稳定高效的通信机制,这对后续类似项目的开发提供了宝贵经验。