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 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 getData() async { return null; } } class BasePageController 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 = [].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> 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(); } } }