149 lines
3.4 KiB
Dart
149 lines
3.4 KiB
Dart
import 'dart:async';
|
||
|
||
import 'package:easy_refresh/easy_refresh.dart';
|
||
import 'package:flutter/widgets.dart';
|
||
import 'package:flutter_dmzj/app/log.dart';
|
||
|
||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||
import 'package:get/get.dart';
|
||
|
||
class BaseController extends GetxController {
|
||
/// 加载中,更新页面
|
||
var pageLoadding = false.obs;
|
||
|
||
/// 加载中,不会更新页面
|
||
var loadding = false;
|
||
|
||
/// 空白页面
|
||
var pageEmpty = false.obs;
|
||
|
||
/// 页面错误
|
||
var pageError = false.obs;
|
||
|
||
/// 未登录
|
||
var notLogin = false.obs;
|
||
|
||
/// 错误信息
|
||
var errorMsg = "".obs;
|
||
|
||
Error? error;
|
||
|
||
/// 显示错误
|
||
/// * [msg] 错误信息
|
||
/// * [showPageError] 显示页面错误
|
||
/// * 只在第一页加载错误时showPageError=true,后续页加载错误时使用Toast弹出通知
|
||
void handleError(Object exception, {bool showPageError = false}) {
|
||
Log.logPrint(exception);
|
||
var msg = exceptionToString(exception);
|
||
if (exception is Error) {
|
||
error = exception;
|
||
}
|
||
if (showPageError) {
|
||
pageError.value = true;
|
||
errorMsg.value = msg;
|
||
} else {
|
||
SmartDialog.showToast(exceptionToString(msg));
|
||
}
|
||
}
|
||
|
||
String exceptionToString(Object exception) {
|
||
return exception.toString().replaceAll("Exception:", "");
|
||
}
|
||
|
||
void onLogin() {}
|
||
void onLogout() {}
|
||
}
|
||
|
||
class BaseDataController<T> extends BaseController {
|
||
T? data;
|
||
Future loadData() async {
|
||
try {
|
||
if (loadding) return;
|
||
loadding = true;
|
||
pageError.value = false;
|
||
pageLoadding.value = true;
|
||
error = null;
|
||
var result = await getData();
|
||
data = result;
|
||
} catch (e) {
|
||
handleError(exceptionToString(e), showPageError: true);
|
||
} finally {
|
||
loadding = false;
|
||
pageLoadding.value = false;
|
||
}
|
||
}
|
||
|
||
Future<T?> getData() async {
|
||
return null;
|
||
}
|
||
}
|
||
|
||
class BasePageController<T> extends BaseController {
|
||
final ScrollController scrollController = ScrollController();
|
||
final EasyRefreshController easyRefreshController = EasyRefreshController();
|
||
int currentPage = 1;
|
||
int count = 0;
|
||
int maxPage = 0;
|
||
int pageSize = 24;
|
||
var canLoadMore = false.obs;
|
||
var list = <T>[].obs;
|
||
|
||
Future refreshData() async {
|
||
currentPage = 1;
|
||
list.clear();
|
||
await loadData();
|
||
}
|
||
|
||
Future loadData() async {
|
||
try {
|
||
if (loadding) return;
|
||
loadding = true;
|
||
pageError.value = false;
|
||
pageEmpty.value = false;
|
||
notLogin.value = false;
|
||
error = null;
|
||
pageLoadding.value = currentPage == 1;
|
||
|
||
var result = await getData(currentPage, pageSize);
|
||
//是否可以加载更多
|
||
if (result.isNotEmpty) {
|
||
currentPage++;
|
||
canLoadMore.value = true;
|
||
pageEmpty.value = false;
|
||
} else {
|
||
canLoadMore.value = false;
|
||
if (currentPage == 1) {
|
||
pageEmpty.value = true;
|
||
}
|
||
}
|
||
// 赋值数据
|
||
if (currentPage == 1) {
|
||
list.value = result;
|
||
} else {
|
||
list.addAll(result);
|
||
}
|
||
} catch (e) {
|
||
handleError(e, showPageError: currentPage == 1);
|
||
} finally {
|
||
loadding = false;
|
||
pageLoadding.value = false;
|
||
}
|
||
}
|
||
|
||
Future<List<T>> getData(int page, int pageSize) async {
|
||
return [];
|
||
}
|
||
|
||
void scrollToTopOrRefresh() {
|
||
if (scrollController.offset > 0) {
|
||
scrollController.animateTo(
|
||
0,
|
||
duration: const Duration(milliseconds: 200),
|
||
curve: Curves.linear,
|
||
);
|
||
} else {
|
||
easyRefreshController.callRefresh();
|
||
}
|
||
}
|
||
}
|