123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- import 'package:flutter/material.dart';
- import 'package:flutter_habit/common/BaseArchitectural.dart';
- import 'package:flutter_habit/common/I18N.dart';
- import 'package:flutter_habit/common/components/PopMenus.dart';
- import 'package:flutter_habit/provider/ConfigProvider.dart';
- import 'package:flutter_habit/provider/DataProvider.dart';
- import 'package:flutter_habit/provider/UserProvider.dart';
- import 'package:flutter_habit/common/utils/ConvertUtils.dart';
- import 'package:flutter_habit/common/utils/VerificationUtils.dart';
- import 'package:flutter_habit/database/entity/FoodInfo.dart';
- import 'package:flutter_habit/database/entity/LifeInfo.dart';
- import 'package:flutter_habit/database/mapper/FoodInfoMapper.dart';
- import 'package:flutter_habit/database/mapper/LifeInfoMapper.dart';
- import 'package:flutter_habit/network/Repository.dart';
- import 'package:flutter_habit/view/record/sub/FoodRecordPage.dart';
- import 'package:provider/provider.dart';
- class LifeInfoRecordingPage extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return MultiProvider(
- providers: [
- ChangeNotifierProvider<LifeInfoRecordingPageService>(
- create: (_) => LifeInfoRecordingPageService(context)),
- ChangeNotifierProvider<LifeInfoRecordingPageModel>(
- create: (_) => LifeInfoRecordingPageModel(context)),
- ],
- child: _LifeInfoRecordingPageView(),
- );
- }
- }
- // model
- class LifeInfoRecordingPageModel extends BaseModel {
- LifeInfoRecordingPageModel(BuildContext context) : super(context);
- int? currId;
- late bool isSignGetUp;
- late bool isSignBreakfast;
- late bool isSignMidRest;
- late bool isSignLunch;
- late bool isSignDinner;
- late bool isSignRest;
- @override
- void init(BuildContext context) {
-
- super.init(context);
- currId = null;
- isSignGetUp = true;
- isSignBreakfast = true;
- isSignMidRest = true;
- isSignLunch = true;
- isSignDinner = true;
- isSignRest = true;
- }
- @override
- Future<void> asyncInit(BuildContext context) async {
- DateTime now = DateTime.now();
- List<LifeInfo> list = (await LifeInfoMapper().selectWhere(
- "date >= ${ConvertUtils.dateOfDateTime(now).millisecondsSinceEpoch}"))!;
- if (list.isNotEmpty) {
- LifeInfo localLifeInfo = list[0];
- currId = list[0].getId();
- isSignGetUp = localLifeInfo.getGetUpTime() != null;
- isSignBreakfast = localLifeInfo.getBreakfastTime() != null;
- isSignMidRest = localLifeInfo.getMidRestTime() != null;
- isSignLunch = localLifeInfo.getLunchTime() != null;
- isSignDinner = localLifeInfo.getDinnerTime() != null;
- isSignRest = localLifeInfo.getRestTime() != null;
- } else {
- await LifeInfoMapper()
- .insert(LifeInfo().setDate(now.millisecondsSinceEpoch));
- list = (await LifeInfoMapper().selectWhere(
- "date >= ${ConvertUtils.dateOfDateTime(now).millisecondsSinceEpoch}"))!;
- currId = list[0].getId();
- isSignGetUp = false;
- isSignBreakfast = false;
- isSignMidRest = false;
- isSignLunch = false;
- isSignDinner = false;
- isSignRest = false;
- }
- refresh();
- }
- }
- // service
- class LifeInfoRecordingPageService extends BaseProvider {
- LifeInfoRecordingPageService(BuildContext context) : super(context);
- Future<void> signGetUp(BuildContext context) async {
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: false);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: false);
- // 记录
- await PopMenus.sliderConfirm(
- context: context,
- content: Text(I18N.of("滑动来打卡")),
- function: () async {
- LifeInfo lifeInfo = LifeInfo();
- lifeInfo.setId(model.currId);
- lifeInfo.setGetUpTime(DateTime.now().millisecondsSinceEpoch);
- model.isSignGetUp =
- await LifeInfoMapper().updateByFirstKeySelective(lifeInfo);
- // 时间验证
- if (!VerifyUtils.nowIsBetweenTime(
- configProvider.getUpTimeStart, configProvider.getUpTimeEnd)) {
- await PopMenus.attention(
- context: context, content: Text(I18N.of("非打卡时间打卡成功")));
- } else {
- // 增加金币
- UserProvider userProvider =
- Provider.of<UserProvider>(context, listen: false);
- if (userProvider.token != null) {
- int? increasedCoin = await Repository.getInstance()!
- .increaseCoin(context, userProvider.uid, userProvider.token);
- if (increasedCoin != null) {
- await PopMenus.coinAdd(
- context: context, addedCoins: increasedCoin);
- userProvider.coins += increasedCoin;
- userProvider.refresh();
- }
- }
- }
- model.refresh();
- await Provider.of<DataProvider>(context, listen: false)
- .loadLifeInfoData();
- },
- );
- }
- Future<void> signBreakfast(BuildContext context) async {
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: false);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: false);
- List? info = await Navigator.of(context)
- .push(MaterialPageRoute(builder: (_) => FoodRecordPage()));
- if (info != null) {
- LifeInfo lifeInfo = LifeInfo();
- lifeInfo.setId(model.currId);
- lifeInfo.setBreakfastId(info[0]);
- lifeInfo.setBreakfastQuantity(info[1]);
- lifeInfo.setBreakfastMoney(info[3]);
- lifeInfo.setBreakfastTime(DateTime.now().millisecondsSinceEpoch);
- model.isSignBreakfast =
- await LifeInfoMapper().updateByFirstKeySelective(lifeInfo);
- // 增加食用次数
- FoodInfo foodInfo = FoodInfo();
- foodInfo.setId(info[0]);
- foodInfo.setEatTimes(info[2] + 1);
- await FoodInfoMapper().updateByFirstKeySelective(foodInfo);
- // 时间验证
- if (!VerifyUtils.nowIsBetweenTime(
- configProvider.breakfastTimeStart, configProvider.breakfastTimeEnd)) {
- await PopMenus.attention(
- context: context, content: Text(I18N.of("非打卡时间打卡成功")));
- } else {
- // 增加金币
- UserProvider userProvider =
- Provider.of<UserProvider>(context, listen: false);
- if (userProvider.token != null) {
- int? increasedCoin = await Repository.getInstance()!
- .increaseCoin(context, userProvider.uid, userProvider.token);
- if (increasedCoin != null) {
- await PopMenus.coinAdd(context: context, addedCoins: increasedCoin);
- userProvider.coins += increasedCoin;
- userProvider.refresh();
- }
- }
- }
- model.refresh();
- await Provider.of<DataProvider>(context, listen: false)
- .loadLifeInfoData();
- }
- }
- Future<void> signLunch(BuildContext context) async {
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: false);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: false);
- List? info = await Navigator.of(context)
- .push(MaterialPageRoute(builder: (_) => FoodRecordPage()));
- if (info != null) {
- LifeInfo lifeInfo = LifeInfo();
- lifeInfo.setId(model.currId);
- lifeInfo.setLunchId(info[0]);
- lifeInfo.setLunchQuantity(info[1]);
- lifeInfo.setLunchMoney(info[3]);
- lifeInfo.setLunchTime(DateTime.now().millisecondsSinceEpoch);
- model.isSignLunch =
- await LifeInfoMapper().updateByFirstKeySelective(lifeInfo);
- // 增加食用次数
- FoodInfo foodInfo = FoodInfo();
- foodInfo.setId(info[0]);
- foodInfo.setEatTimes(info[2] + 1);
- await FoodInfoMapper().updateByFirstKeySelective(foodInfo);
- // 时间验证
- if (!VerifyUtils.nowIsBetweenTime(
- configProvider.lunchTimeStart, configProvider.lunchTimeEnd)) {
- await PopMenus.attention(
- context: context, content: Text(I18N.of("非打卡时间打卡成功")));
- } else {
- // 增加金币
- UserProvider userProvider =
- Provider.of<UserProvider>(context, listen: false);
- if (userProvider.token != null) {
- int? increasedCoin = await Repository.getInstance()!
- .increaseCoin(context, userProvider.uid, userProvider.token);
- if (increasedCoin != null) {
- await PopMenus.coinAdd(context: context, addedCoins: increasedCoin);
- userProvider.coins += increasedCoin;
- userProvider.refresh();
- }
- }
- }
- model.refresh();
- await Provider.of<DataProvider>(context, listen: false)
- .loadLifeInfoData();
- }
- }
- Future<void> signDinner(BuildContext context) async {
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: false);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: false);
- List? info = await Navigator.of(context)
- .push(MaterialPageRoute(builder: (_) => FoodRecordPage()));
- if (info != null) {
- LifeInfo lifeInfo = LifeInfo();
- lifeInfo.setId(model.currId);
- lifeInfo.setDinnerId(info[0]);
- lifeInfo.setDinnerQuantity(info[1]);
- lifeInfo.setDinnerMoney(info[3]);
- lifeInfo.setDinnerTime(DateTime.now().millisecondsSinceEpoch);
- model.isSignDinner =
- await LifeInfoMapper().updateByFirstKeySelective(lifeInfo);
- // 增加食用次数
- FoodInfo foodInfo = FoodInfo();
- foodInfo.setId(info[0]);
- foodInfo.setEatTimes(info[2] + 1);
- await FoodInfoMapper().updateByFirstKeySelective(foodInfo);
- // 时间验证
- if (!VerifyUtils.nowIsBetweenTime(
- configProvider.dinnerTimeStart, configProvider.dinnerTimeEnd)) {
- await PopMenus.attention(
- context: context, content: Text(I18N.of("非打卡时间打卡成功")));
- } else {
- // 增加金币
- UserProvider userProvider =
- Provider.of<UserProvider>(context, listen: false);
- if (userProvider.token != null) {
- int? increasedCoin = await Repository.getInstance()!
- .increaseCoin(context, userProvider.uid, userProvider.token);
- if (increasedCoin != null) {
- await PopMenus.coinAdd(context: context, addedCoins: increasedCoin);
- userProvider.coins += increasedCoin;
- userProvider.refresh();
- }
- }
- }
- model.refresh();
- await Provider.of<DataProvider>(context, listen: false)
- .loadLifeInfoData();
- }
- }
- Future<void> signRest(BuildContext context) async {
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: false);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: false);
- // 记录
- await PopMenus.sliderConfirm(
- context: context,
- content: Text(I18N.of("滑动来打卡")),
- function: () async {
- LifeInfo lifeInfo = LifeInfo();
- lifeInfo.setId(model.currId);
- lifeInfo.setRestTime(DateTime.now().millisecondsSinceEpoch);
- model.isSignRest =
- await LifeInfoMapper().updateByFirstKeySelective(lifeInfo);
- // 时间验证
- if (!VerifyUtils.nowIsBetweenTime(
- configProvider.restTimeStart, configProvider.restTimeEnd)) {
- await PopMenus.attention(
- context: context, content: Text(I18N.of("非打卡时间打卡成功")));
- } else {
- // 增加金币
- UserProvider userProvider =
- Provider.of<UserProvider>(context, listen: false);
- if (userProvider.token != null) {
- int? increasedCoin = await Repository.getInstance()!
- .increaseCoin(context, userProvider.uid, userProvider.token);
- if (increasedCoin != null) {
- await PopMenus.coinAdd(
- context: context, addedCoins: increasedCoin);
- userProvider.coins += increasedCoin;
- userProvider.refresh();
- }
- }
- }
- model.refresh();
- await Provider.of<DataProvider>(context, listen: false)
- .loadLifeInfoData();
- },
- );
- }
- Future<void> signMidRest(BuildContext context) async {
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: false);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: false);
- // 记录
- await PopMenus.sliderConfirm(
- context: context,
- content: Text(I18N.of("滑动来打卡")),
- function: () async {
- LifeInfo lifeInfo = LifeInfo();
- lifeInfo.setId(model.currId);
- lifeInfo.setMidRestTime(DateTime.now().millisecondsSinceEpoch);
- model.isSignMidRest =
- await LifeInfoMapper().updateByFirstKeySelective(lifeInfo);
- // 时间验证
- if (!VerifyUtils.nowIsBetweenTime(
- configProvider.midRestTimeStart, configProvider.midRestTimeEnd)) {
- await PopMenus.attention(
- context: context, content: Text(I18N.of("非打卡时间打卡成功")));
- } else {
- // 增加金币
- UserProvider userProvider =
- Provider.of<UserProvider>(context, listen: false);
- if (userProvider.token != null) {
- int? increasedCoin = await Repository.getInstance()!
- .increaseCoin(context, userProvider.uid, userProvider.token);
- if (increasedCoin != null) {
- await PopMenus.coinAdd(
- context: context, addedCoins: increasedCoin);
- userProvider.coins += increasedCoin;
- userProvider.refresh();
- }
- }
- }
- model.refresh();
- await Provider.of<DataProvider>(context, listen: false)
- .loadLifeInfoData();
- },
- );
- }
- }
- // view
- class _LifeInfoRecordingPageView extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- LifeInfoRecordingPageService service =
- Provider.of<LifeInfoRecordingPageService>(context, listen: false);
- LifeInfoRecordingPageModel model =
- Provider.of<LifeInfoRecordingPageModel>(context, listen: true);
- ConfigProvider configProvider =
- Provider.of<ConfigProvider>(context, listen: true);
- return Scaffold(
- appBar: AppBar(
- title: Text(I18N.of("日常生活记录")),
- ),
- body: Padding(
- padding: EdgeInsets.all(16),
- child: ListView(
- children: <Widget>[
- ListTile(
- leading: Icon(Icons.wb_sunny),
- title: Text(I18N.of("起床打卡")),
- subtitle: Text(
- "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.getUpTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.getUpTimeEnd!)}"),
- trailing: Icon(
- model.isSignGetUp ? Icons.check_circle : Icons.chevron_right,
- color: model.isSignGetUp
- ? Theme.of(context).colorScheme.secondary
- : null,
- ),
- onTap:
- model.isSignGetUp ? null : () => service.signGetUp(context),
- ),
- ListTile(
- leading: Icon(Icons.free_breakfast),
- title: Text(I18N.of("早饭打卡")),
- subtitle: Text(
- "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.breakfastTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.breakfastTimeEnd!)}"),
- trailing: Icon(
- model.isSignBreakfast
- ? Icons.check_circle
- : Icons.chevron_right,
- color: model.isSignBreakfast
- ? Theme.of(context).colorScheme.secondary
- : null,
- ),
- onTap: model.isSignBreakfast
- ? null
- : () => service.signBreakfast(context),
- ),
- ListTile(
- leading: Icon(Icons.local_dining),
- title: Text(I18N.of("午饭打卡")),
- subtitle: Text(
- "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.lunchTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.lunchTimeEnd!)}"),
- trailing: Icon(
- model.isSignLunch ? Icons.check_circle : Icons.chevron_right,
- color: model.isSignLunch
- ? Theme.of(context).colorScheme.secondary
- : null,
- ),
- onTap:
- model.isSignLunch ? null : () => service.signLunch(context),
- ),
- ListTile(
- leading: Icon(Icons.local_hotel),
- title: Text(I18N.of("午休打卡")),
- subtitle: Text(
- "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.midRestTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.midRestTimeEnd!)}"),
- trailing: Icon(
- model.isSignMidRest ? Icons.check_circle : Icons.chevron_right,
- color:
- model.isSignMidRest
- ? Theme.of(context).colorScheme.secondary
- : null,
- ),
- onTap: model.isSignMidRest
- ? null
- : () => service.signMidRest(context),
- ),
- ListTile(
- leading: Icon(Icons.restaurant),
- title: Text(I18N.of("晚饭打卡")),
- subtitle: Text(
- "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.dinnerTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.dinnerTimeEnd!)}"),
- trailing: Icon(
- model.isSignDinner ? Icons.check_circle : Icons.chevron_right,
- color:
- model.isSignDinner
- ? Theme.of(context).colorScheme.secondary
- : null,
- ),
- onTap:
- model.isSignDinner ? null : () => service.signDinner(context),
- ),
- ListTile(
- leading: Icon(Icons.brightness_4),
- title: Text(I18N.of("晚安打卡")),
- subtitle: Text(
- "${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.restTimeStart)} - ${ConvertUtils.timeFormMillisecondsSinceEpoch(configProvider.restTimeEnd!)}"),
- trailing: Icon(
- model.isSignRest ? Icons.check_circle : Icons.chevron_right,
- color: model.isSignRest
- ? Theme.of(context).colorScheme.secondary
- : null,
- ),
- onTap: model.isSignRest ? null : () => service.signRest(context),
- ),
- ],
- ),
- ),
- );
- }
- }
|