Files
flutter-todos/lib/logic/task_detail_page_logic.dart

239 lines
7.8 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:todo_list/config/api_service.dart';
import 'package:todo_list/config/provider_config.dart';
import 'package:todo_list/database/database.dart';
import 'package:todo_list/i10n/localization_intl.dart';
import 'package:todo_list/json/color_bean.dart';
import 'package:todo_list/json/task_bean.dart';
import 'package:todo_list/json/task_icon_bean.dart';
import 'package:todo_list/model/all_model.dart';
import 'package:todo_list/utils/shared_util.dart';
import 'package:todo_list/widgets/custom_icon_widget.dart';
import 'package:todo_list/widgets/net_loading_widget.dart';
class TaskDetailPageLogic {
final TaskDetailPageModel _model;
TaskDetailPageLogic(this._model);
double _getOverallProgress() {
int length = _model.taskBean.detailList.length;
double overallProgress = 0.0;
for (int i = 0; i < length; i++) {
overallProgress += _model.taskBean.detailList[i].itemProgress / length;
}
_model.taskBean.overallProgress =
overallProgress > 0.999 ? 1.0 : overallProgress;
return overallProgress;
}
void refreshProgress(
TaskDetailBean taskDetailBean, progress, MainPageModel model) {
taskDetailBean.itemProgress = progress;
_getOverallProgress();
model.refresh();
_model.refresh();
}
Color getTextColor(BuildContext context){
final taskBean = _model.taskBean;
final textColor = taskBean.textColor;
if(textColor != null) return ColorBean.fromBean(textColor);
return DefaultTextStyle.of(context).style.backgroundColor;
}
//页面退出需要执行的逻辑,isDeleting表示这个页面是否执行了删除当前任务的操作
void exitPage({bool isDeleting = false}) {
final context = _model.context;
final mainPageModel = _model.globalModel.mainPageModel;
bool needUpdate = needUpdateDatabase();
if (needUpdate && !isDeleting) {
///如果一个任务中的所有任务项都完成了,因为主页面都是未完成任务,所以删除主页面的该任务
if (_model.taskBean.overallProgress >= 1.0) {
_model.taskBean.finishDate = DateTime.now().toIso8601String();
///下面这个延时操作,目的如下,如果一个任务完成了,主页面会把这个任务去除掉
///这个时候主页任务卡片的herotag就消失了因为herotag不一致会导致hero动画失效
Future.delayed(
Duration(
milliseconds: 800,
), () {
debugPrint("删除了");
removeTask(mainPageModel);
debugPrint("刷新main");
mainPageModel.refresh();
});
}
_model.taskBean.changeTimes++;
DBProvider.db.updateTask(_model.taskBean).then((value) async {
final account =
await SharedUtil.instance.getString(Keys.account) ?? 'default';
if (account != 'default') {
_model.taskBean.uniqueId == null
? mainPageModel.logic.postCreateTask(_model.taskBean)
: mainPageModel.logic.postUpdateTask(_model.taskBean);
}
///如果是从"完成列表"过来
if (_model.doneTaskPageModel != null) {
mainPageModel.logic.getTasks();
_model.doneTaskPageModel.logic.getDoneTasks().then((value) {
_model.doneTaskPageModel.refresh();
Navigator.of(context).pop();
});
}
///如果是从"搜索页面"过来
else if (_model.searchPageModel != null) {
_model.isExiting = true;
_model.refresh();
mainPageModel.logic.getTasks();
_model.searchPageModel.logic.onEditingComplete();
Navigator.of(context).pop();
} else {
debugPrint("退出了");
_model.isExiting = true;
_model.refresh();
Navigator.of(context).pop();
}
});
return;
}
_model.isExiting = true;
_model.refresh();
if(isDeleting){
Future.delayed(
Duration(
milliseconds: 800,
), () {
debugPrint("删除了");
removeTask(mainPageModel);
debugPrint("刷新main");
mainPageModel.refresh();
});
}
Navigator.of(context).pop();
}
bool needUpdateDatabase() {
return _model.progress != _model.taskBean.overallProgress;
}
void deleteTask(MainPageModel mainPageModel) async {
final account =
await SharedUtil.instance.getString(Keys.account) ?? 'default';
showDialog(
context: _model.context,
builder: (ctx) {
return AlertDialog(
title: Text("${DemoLocalizations.of(_model.context).doDelete}${_model.taskBean.taskName}"),
actions: <Widget>[
FlatButton(onPressed: (){
Navigator.of(_model.context).pop();
if (account == 'default') {
deleteAndExit(mainPageModel);
} else {
deleteCloudTask(mainPageModel, account);
}
}, child: Text("删除",style: TextStyle(color: Colors.redAccent),)),
FlatButton(onPressed: (){
Navigator.of(_model.context).pop();
}, child: Text("取消",style: TextStyle(color: Colors.green),)),
],
);
});
}
void deleteCloudTask(MainPageModel mainPageModel, String account) async {
showDialog(
context: _model.context,
builder: (ctx) {
return NetLoadingWidget();
});
final token = await SharedUtil.instance.getString(Keys.token);
ApiService.instance.postDeleteTask(
success: (CommonBean bean) {
Navigator.of(_model.context).pop();
deleteAndExit(mainPageModel);
},
failed: (CommonBean bean) {
Navigator.of(_model.context).pop();
if (bean.description.contains("任务不存在")) {
deleteAndExit(mainPageModel);
} else {
_showTextDialog(bean.description, _model.context);
}
},
error: (msg) {
Navigator.of(_model.context).pop();
_showTextDialog(msg, _model.context);
},
params: {
"token": token,
"account": account,
"uniqueId": _model.taskBean.uniqueId,
},
token: _model.cancelToken,
);
}
void deleteAndExit(MainPageModel mainPageModel) {
// removeTask(mainPageModel);
DBProvider.db.deleteTask(_model.taskBean.id);
// _model.refresh();
//如果是从“完成列表”过来
final doneTaskPageModel = _model.doneTaskPageModel;
if (doneTaskPageModel != null) {
doneTaskPageModel.doneTasks.removeAt(doneTaskPageModel.currentTapIndex);
doneTaskPageModel.refresh();
}
//如果是从"搜索界面"过来
final searchPageModel = _model.searchPageModel;
if (searchPageModel != null) {
searchPageModel.searchTasks.removeAt(searchPageModel.currentTapIndex);
searchPageModel.refresh();
}
exitPage(isDeleting: true);
}
void removeTask(MainPageModel mainPageModel) {
for (var i = 0; i < mainPageModel.tasks.length; i++) {
var task = mainPageModel.tasks[i];
if (task.id == _model.taskBean.id) {
mainPageModel.tasks.removeAt(i);
break;
}
}
}
void editTask(MainPageModel mainPageModel) {
Navigator.of(_model.context).push(
new CupertinoPageRoute(
builder: (ctx) {
return ProviderConfig.getInstance().getEditTaskPage(
_model.taskBean.taskIconBean,
taskBean: _model.taskBean,
taskDetailPageModel: _model,
);
},
),
);
}
void _showTextDialog(String text, BuildContext context) {
showDialog(
context: context,
builder: (ctx) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20.0))),
content: Text(text),
);
});
}
}