123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- 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<StudyInfoRecordingPageService>(
- create: (_) => StudyInfoRecordingPageService(context)),
- ChangeNotifierProvider<StudyInfoRecordingPageModel>(
- 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<StudyInfoRecordingPageModel>(context, listen: false);
- model.isLate = i;
- if (i == 0) {
- model.isAbsent = 0;
- }
- model.refresh();
- }
- void setIsAbsent(BuildContext context, int? i) {
- StudyInfoRecordingPageModel model =
- Provider.of<StudyInfoRecordingPageModel>(context, listen: false);
- model.isAbsent = i;
- if (i == 1) {
- model.isLate = 1;
- }
- model.refresh();
- }
- void setIsHomeWorkDone(BuildContext context, int? i) {
- StudyInfoRecordingPageModel model =
- Provider.of<StudyInfoRecordingPageModel>(context, listen: false);
- model.isHomeWorkDone = i;
- model.refresh();
- }
- void setDifficulty(BuildContext context, int? i) {
- StudyInfoRecordingPageModel model =
- Provider.of<StudyInfoRecordingPageModel>(context, listen: false);
- model.difficulty = i;
- model.refresh();
- }
- void preview(BuildContext context) {
- StudyInfoRecordingPageModel model =
- Provider.of<StudyInfoRecordingPageModel>(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<void> record(BuildContext context) async {
- StudyInfoRecordingPageModel model =
- Provider.of<StudyInfoRecordingPageModel>(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<StudyInfo> localStudyInfo = (await StudyInfoMapper().selectWhere(
- "date > ${ConvertUtils.dateOfDateTime(now).millisecondsSinceEpoch}"))!;
- if (localStudyInfo.isEmpty){
- // 今日首次
- // 增加金币
- 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();
- }
- }
- }
- // 插入
- await StudyInfoMapper().insert(studyInfo);
- await Provider.of<DataProvider>(context,listen: false).loadStudyInfoData();
- Navigator.of(context).pop();
- }
- }
- // view
- class _StudyInfoRecordingPageView extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- StudyInfoRecordingPageService service =
- Provider.of<StudyInfoRecordingPageService>(context, listen: false);
- StudyInfoRecordingPageModel model =
- Provider.of<StudyInfoRecordingPageModel>(context, listen: true);
- return Scaffold(
- appBar: AppBar(
- title: Text(I18N.of("记录课程学习")),
- ),
- body: Padding(
- padding: EdgeInsets.all(16),
- child: ListView(
- children: <Widget>[
- 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: <Widget>[
- Text(I18N.of("是否迟到")),
- Row(
- children: [I18N.of("是"), 1, I18N.of("否"), 0].map((i) {
- if (i is int) {
- return Radio<int>(
- 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: <Widget>[
- Text(I18N.of("是否缺席")),
- Row(
- children: [I18N.of("是"), 1, I18N.of("否"), 0].map((i) {
- if (i is int) {
- return Radio<int>(
- 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: <Widget>[
- Text(I18N.of("作业是否完成")),
- Row(
- children: [I18N.of("是"), 1, I18N.of("否"), 0].map((i) {
- if (i is int) {
- return Radio<int>(
- 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: <Widget>[
- Text(I18N.of("课程难度")),
- Row(
- children: [
- I18N.of("简单"),
- 0,
- I18N.of("一般"),
- 1,
- I18N.of("困难"),
- 2
- ].map((i) {
- if (i is int) {
- return Radio<int>(
- 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: <Widget>[
- 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: <Widget>[
- 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),
- ),
- ],
- ),
- ),
- );
- }
- }
|