import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.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/DataProvider.dart'; import 'package:flutter_habit/provider/UserProvider.dart'; import 'package:flutter_habit/common/utils/ConvertUtils.dart'; import 'package:flutter_habit/database/entity/StudyInfo.dart'; import 'package:flutter_habit/database/mapper/StudyInfoMapper.dart'; import 'package:flutter_habit/network/Repository.dart'; import 'package:provider/provider.dart'; class StudyInfoRecordingPage extends StatelessWidget { @override Widget build(BuildContext context) { return MultiProvider( providers: [ ChangeNotifierProvider( create: (_) => StudyInfoRecordingPageService(context)), ChangeNotifierProvider( create: (_) => StudyInfoRecordingPageModel(context)), ], child: _StudyInfoRecordingPageView(), ); } } // model class StudyInfoRecordingPageModel extends BaseModel { StudyInfoRecordingPageModel(BuildContext context) : super(context); TextEditingController? courseNameController; int? isLate; int? isAbsent; int? isHomeWorkDone; TextEditingController? homeWorkController; int? difficulty; TextEditingController? troubleController; @override void init(BuildContext context) { super.init(context); courseNameController = TextEditingController(); isLate = 0; isAbsent = 0; isHomeWorkDone = 1; homeWorkController = TextEditingController(); difficulty = 0; troubleController = TextEditingController(); } } // service class StudyInfoRecordingPageService extends BaseProvider { StudyInfoRecordingPageService(BuildContext context) : super(context); void setIsLate(BuildContext context, int? i) { StudyInfoRecordingPageModel model = Provider.of(context, listen: false); model.isLate = i; if (i == 0) { model.isAbsent = 0; } model.refresh(); } void setIsAbsent(BuildContext context, int? i) { StudyInfoRecordingPageModel model = Provider.of(context, listen: false); model.isAbsent = i; if (i == 1) { model.isLate = 1; } model.refresh(); } void setIsHomeWorkDone(BuildContext context, int? i) { StudyInfoRecordingPageModel model = Provider.of(context, listen: false); model.isHomeWorkDone = i; model.refresh(); } void setDifficulty(BuildContext context, int? i) { StudyInfoRecordingPageModel model = Provider.of(context, listen: false); model.difficulty = i; model.refresh(); } void preview(BuildContext context) { StudyInfoRecordingPageModel model = Provider.of(context, listen: false); Navigator.of(context).push(MaterialPageRoute( builder: (_) => Scaffold( appBar: AppBar( title: Text(I18N.of("MarkDown预览")), ), body: Markdown( data: model.troubleController!.text.toString(), ), ))); } Future record(BuildContext context) async { StudyInfoRecordingPageModel model = Provider.of(context, listen: false); if (model.courseNameController!.text.trim().isEmpty) { await PopMenus.attention(context: context,content: Text(I18N.of("课程主题不能为空"))); return; } DateTime now = DateTime.now(); StudyInfo studyInfo = StudyInfo(); studyInfo.setDate(now.millisecondsSinceEpoch); studyInfo.setCourseName(model.courseNameController!.text); studyInfo.setIsLate(model.isLate); studyInfo.setIsAbsent(model.isAbsent); studyInfo.setIsHomeWorkDone(model.isHomeWorkDone); if (model.isHomeWorkDone == 0) { studyInfo.setHomeworks(model.homeWorkController!.text); } studyInfo.setDifficulty(model.difficulty); studyInfo.setIsTroublesSolved(1); if (model.difficulty == 2) { studyInfo.setIsTroublesSolved(0); studyInfo.setTroubles(model.troubleController!.text); } // 今日首次? List localStudyInfo = (await StudyInfoMapper().selectWhere( "date > ${ConvertUtils.dateOfDateTime(now).millisecondsSinceEpoch}"))!; if (localStudyInfo.isEmpty){ // 今日首次 // 增加金币 UserProvider userProvider = Provider.of(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(); } } } // 插入 await StudyInfoMapper().insert(studyInfo); await Provider.of(context,listen: false).loadStudyInfoData(); Navigator.of(context).pop(); } } // view class _StudyInfoRecordingPageView extends StatelessWidget { @override Widget build(BuildContext context) { StudyInfoRecordingPageService service = Provider.of(context, listen: false); StudyInfoRecordingPageModel model = Provider.of(context, listen: true); return Scaffold( appBar: AppBar( title: Text(I18N.of("记录课程学习")), ), body: Padding( padding: EdgeInsets.all(16), child: ListView( children: [ Padding( padding: EdgeInsets.only(top: 10, bottom: 10), child: TextFormField( controller: model.courseNameController, decoration: InputDecoration( border: OutlineInputBorder(), labelText: I18N.of("课程主题"), ), ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(I18N.of("是否迟到")), Row( children: [I18N.of("是"), 1, I18N.of("否"), 0].map((i) { if (i is int) { return Radio( value: i, groupValue: model.isLate, onChanged: (i) => service.setIsLate(context, i), ); } else if (i is String) { return Text(i); } return Container(); }).toList(), ) ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(I18N.of("是否缺席")), Row( children: [I18N.of("是"), 1, I18N.of("否"), 0].map((i) { if (i is int) { return Radio( value: i, groupValue: model.isAbsent, onChanged: (i) => service.setIsAbsent(context, i), ); } else if (i is String) { return Text(i); } return Container(); }).toList(), ) ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(I18N.of("作业是否完成")), Row( children: [I18N.of("是"), 1, I18N.of("否"), 0].map((i) { if (i is int) { return Radio( value: i, groupValue: model.isHomeWorkDone, onChanged: (i) => service.setIsHomeWorkDone(context, i), ); } else if (i is String) { return Text(i); } return Container(); }).toList(), ) ], ), Padding( padding: EdgeInsets.only(top: 10, bottom: 10), child: TextFormField( enabled: model.isHomeWorkDone == 0, maxLines: model.isHomeWorkDone == 0 ? 5 : 1, controller: model.homeWorkController, decoration: InputDecoration( border: OutlineInputBorder(), labelText: I18N.of("未完成的作业"), ), ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(I18N.of("课程难度")), Row( children: [ I18N.of("简单"), 0, I18N.of("一般"), 1, I18N.of("困难"), 2 ].map((i) { if (i is int) { return Radio( value: i, groupValue: model.difficulty, onChanged: (i) => service.setDifficulty(context, i), ); } else if (i is String) { return Text(i); } return Container(); }).toList(), ) ], ), Padding( padding: EdgeInsets.only(top: 10, bottom: 10), child: Stack( children: [ TextFormField( enabled: model.difficulty == 2, maxLines: model.difficulty == 2 ? 5 : 1, controller: model.troubleController, decoration: InputDecoration( border: OutlineInputBorder(), labelText: I18N.of("遇到的问题"), hintText: I18N.of("支持MarkDown"), ), ), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ IconButton( icon: Icon( Icons.zoom_out_map, color: model.difficulty != 2 ? null : Theme.of(context).colorScheme.secondary, ), onPressed: model.difficulty != 2 ? null : () => service.preview(context), ), ], ), ], ), ), ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all( Theme.of(context).colorScheme.secondary), foregroundColor: MaterialStateProperty.all(Theme.of(context).cardColor)), child: Text(I18N.of("记录")), onPressed: () => service.record(context), ), ], ), ), ); } }