135 lines
3.5 KiB
Dart
135 lines
3.5 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:sensors_plus/sensors_plus.dart';
|
||
import 'package:vibration/vibration.dart';
|
||
import 'dart:async';
|
||
import '../models/record.dart';
|
||
import './record_page.dart';
|
||
import '../widgets/record_list.dart';
|
||
import '../data/mock_data.dart'; // 暂时使用模拟数据
|
||
import '../services/database_service.dart';
|
||
|
||
class HomePage extends StatefulWidget {
|
||
const HomePage({Key? key}) : super(key: key);
|
||
|
||
@override
|
||
State<HomePage> createState() => _HomePageState();
|
||
}
|
||
|
||
class _HomePageState extends State<HomePage> {
|
||
StreamSubscription? _accelerometerSubscription;
|
||
DateTime? _lastShakeTime;
|
||
int _shakeCount = 0;
|
||
bool _isNavigating = false;
|
||
final _dbService = DatabaseService();
|
||
List<Record> records = [];
|
||
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
_initShakeDetection();
|
||
_loadRecords();
|
||
}
|
||
|
||
/// 加载记录
|
||
Future<void> _loadRecords() async {
|
||
final loadedRecords = await _dbService.getAllRecords();
|
||
setState(() {
|
||
records = loadedRecords;
|
||
records.sort((a, b) => b.createTime.compareTo(a.createTime));
|
||
});
|
||
}
|
||
|
||
/// 初始化摇晃检测
|
||
void _initShakeDetection() {
|
||
_accelerometerSubscription = accelerometerEvents.listen((event) {
|
||
// 主要检测左右摇晃(x轴)
|
||
if (event.x.abs() > 25) {
|
||
final now = DateTime.now();
|
||
if (_lastShakeTime == null) {
|
||
_lastShakeTime = now;
|
||
_shakeCount = 1;
|
||
} else {
|
||
// 缩短有效时间窗口,要求更快的摇晃
|
||
if (now.difference(_lastShakeTime!) < const Duration(milliseconds: 500)) {
|
||
_shakeCount++;
|
||
if (_shakeCount >= 2) {
|
||
_navigateToRecordPageWithVibration();
|
||
_shakeCount = 0;
|
||
_lastShakeTime = null;
|
||
}
|
||
} else {
|
||
// 重置计数
|
||
_shakeCount = 1;
|
||
}
|
||
_lastShakeTime = now;
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
/// 带震动的记账页面导航
|
||
void _navigateToRecordPageWithVibration() async {
|
||
if (_isNavigating) return;
|
||
|
||
_isNavigating = true;
|
||
// 添加震动反馈
|
||
if (await Vibration.hasVibrator() ?? false) {
|
||
Vibration.vibrate(duration: 200);
|
||
}
|
||
|
||
_navigateToRecordPage();
|
||
}
|
||
|
||
/// 导航到记账页面
|
||
void _navigateToRecordPage([Record? record]) {
|
||
Navigator.push(
|
||
context,
|
||
MaterialPageRoute(
|
||
builder: (context) => RecordPage(
|
||
record: record,
|
||
onSave: (newRecord) async {
|
||
if (record != null) {
|
||
await _dbService.updateRecord(newRecord);
|
||
} else {
|
||
await _dbService.insertRecord(newRecord);
|
||
}
|
||
await _loadRecords();
|
||
},
|
||
),
|
||
maintainState: false,
|
||
),
|
||
).then((_) {
|
||
_isNavigating = false;
|
||
});
|
||
}
|
||
|
||
/// 删除记录
|
||
void _deleteRecord(String recordId) async {
|
||
await _dbService.deleteRecord(recordId);
|
||
await _loadRecords();
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return Scaffold(
|
||
appBar: AppBar(
|
||
title: const Text('记账本'),
|
||
),
|
||
body: RecordList(
|
||
records: records,
|
||
onRecordTap: _navigateToRecordPage,
|
||
onRecordDelete: _deleteRecord,
|
||
),
|
||
floatingActionButton: FloatingActionButton(
|
||
onPressed: () => _navigateToRecordPage(),
|
||
child: const Icon(Icons.add),
|
||
),
|
||
);
|
||
}
|
||
|
||
@override
|
||
void dispose() {
|
||
_accelerometerSubscription?.cancel();
|
||
super.dispose();
|
||
}
|
||
} |