From ad141e4bd10dc1d0713e71a1007a4a216755b7db Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Mon, 17 Jan 2022 16:42:46 +0800 Subject: [PATCH] add others --- lib/base/base_state_widget.dart | 4 +- lib/base/base_viewmodel.dart | 11 +- lib/base/http/http.dart | 26 +++- lib/base/http/token_interceptor.dart | 2 +- lib/base/http/url.dart | 4 +- lib/base/routes.dart | 4 + lib/base/theme.dart | 12 +- lib/main.dart | 4 +- lib/module/env/env_page.dart | 180 ++++++++++++++++++--------- lib/module/env/env_viewmodel.dart | 7 +- lib/module/home/home_page.dart | 18 ++- lib/module/login/login_page.dart | 5 +- lib/module/others/other_page.dart | 11 +- lib/module/task/task_page.dart | 101 +++++++++------ lib/module/task/task_viewmodel.dart | 6 +- lib/utils/QlNavigatorObserver.dart | 16 +++ pubspec.lock | 7 ++ pubspec.yaml | 1 + 18 files changed, 291 insertions(+), 128 deletions(-) create mode 100644 lib/utils/QlNavigatorObserver.dart diff --git a/lib/base/base_state_widget.dart b/lib/base/base_state_widget.dart index 5dbd81f..accef8a 100644 --- a/lib/base/base_state_widget.dart +++ b/lib/base/base_state_widget.dart @@ -37,9 +37,9 @@ class _BaseStateWidgetState extends ConsumerState(widget.model); - if (viewModel.failReason != null) { + if (viewModel.failedToast != null) { WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { - failDialog(context, viewModel.failReason!); + failDialog(context, viewModel.failedToast!); viewModel.clearToast(); }); } diff --git a/lib/base/base_viewmodel.dart b/lib/base/base_viewmodel.dart index 3a03f70..d8c8642 100644 --- a/lib/base/base_viewmodel.dart +++ b/lib/base/base_viewmodel.dart @@ -5,9 +5,11 @@ class ViewModel extends ChangeNotifier {} class BaseViewModel extends ViewModel { PageState currentState = PageState.START; String? failReason; + String? failedToast; void loading({bool notify = false}) { failReason = null; + failedToast = null; currentState = PageState.LOADING; if (notify) { notifyListeners(); @@ -16,6 +18,7 @@ class BaseViewModel extends ViewModel { void success({bool notify = true}) { failReason = null; + failedToast = null; currentState = PageState.CONTENT; if (notify) { notifyListeners(); @@ -25,24 +28,28 @@ class BaseViewModel extends ViewModel { void failed(String? reason, {bool notify = false}) { currentState = PageState.FAILED; failReason = reason; + failedToast = null; if (notify) { notifyListeners(); } } + void failToast(String? reason, {bool notify = false}) { currentState = PageState.CONTENT; + failedToast = reason; failReason = reason; if (notify) { notifyListeners(); } } - void clearToast(){ - failReason = null; + void clearToast() { + failedToast = null; } void empty({bool notify = false}) { failReason = null; + failedToast = null; currentState = PageState.EMPTY; if (notify) { notifyListeners(); diff --git a/lib/base/http/http.dart b/lib/base/http/http.dart index 5bc55f7..82dd53f 100644 --- a/lib/base/http/http.dart +++ b/lib/base/http/http.dart @@ -6,9 +6,11 @@ import 'package:dio_log/dio_log.dart'; import 'package:flutter/foundation.dart'; import 'package:qinglong_app/base/http/token_interceptor.dart'; import 'package:qinglong_app/base/userinfo_viewmodel.dart'; +import 'package:qinglong_app/utils/QlNavigatorObserver.dart'; import '../../json.jc.dart'; import '../../main.dart'; +import '../routes.dart'; class Http { static const int NOT_LOGIN = 1000; @@ -43,6 +45,9 @@ class Http { return decodeResponse(response, compute); } on DioError catch (e) { + if (e.response?.statusCode == 401) { + exitLogin(); + } return HttpResponse(success: false, message: e.message, code: 0); } } @@ -54,6 +59,9 @@ class Http { return decodeResponse(response, compute); } on DioError catch (e) { + if (e.response?.statusCode == 401) { + exitLogin(); + } return HttpResponse(success: false, message: e.message, code: 0); } } @@ -65,6 +73,9 @@ class Http { return decodeResponse(response, compute); } on DioError catch (e) { + if (e.response?.statusCode == 401) { + exitLogin(); + } return HttpResponse(success: false, message: e.message, code: 0); } } @@ -75,16 +86,27 @@ class Http { var response = await _dio!.put(uri, data: json); return decodeResponse(response, compute); } on DioError catch (e) { + if (e.response?.statusCode == 401) { + exitLogin(); + } return HttpResponse(success: false, message: e.message, code: 0); } } + static bool pushedLoginPage = false; + + static void exitLogin() { + if (!pushedLoginPage) { + pushedLoginPage = true; + navigatorState.currentState?.pushReplacementNamed(Routes.route_LOGIN); + } + } + static HttpResponse decodeResponse( Response response, bool compute, ) { int code = 0; - if (response.statusCode == 200) { try { if (response.data["code"] == 200) { @@ -191,3 +213,5 @@ void decode() async { } class NullResponse {} + +class NotLoginException implements Exception {} diff --git a/lib/base/http/token_interceptor.dart b/lib/base/http/token_interceptor.dart index eb14cc1..f35d39f 100644 --- a/lib/base/http/token_interceptor.dart +++ b/lib/base/http/token_interceptor.dart @@ -6,7 +6,7 @@ import '../userinfo_viewmodel.dart'; class TokenInterceptor extends Interceptor { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - if (getIt().token != null) { + if (getIt().token != null && getIt().token!.isNotEmpty) { options.headers["Authorization"] = "Bearer " + getIt().token!; } options.queryParameters["t"] = (DateTime.now().millisecondsSinceEpoch~/1000).toString(); diff --git a/lib/base/http/url.dart b/lib/base/http/url.dart index dc497fd..b41966f 100644 --- a/lib/base/http/url.dart +++ b/lib/base/http/url.dart @@ -15,8 +15,8 @@ class Url { static const ENVS = "/api/envs"; static const ADD_ENV = "/api/envs"; static const DEL_ENV = "/api/envs"; - static const DISABLE_ENVS = "/api/disable"; - static const ENABLE_ENVS = "/api/enable"; + static const DISABLE_ENVS = "/api/envs/disable"; + static const ENABLE_ENVS = "/api/envs/enable"; static INTIME_LOG(String cronId) { return "/api/crons/$cronId/log"; diff --git a/lib/base/routes.dart b/lib/base/routes.dart index 8bac20c..ed711e1 100644 --- a/lib/base/routes.dart +++ b/lib/base/routes.dart @@ -2,11 +2,13 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:qinglong_app/module/config/config_edit_page.dart'; import 'package:qinglong_app/module/home/home_page.dart'; +import 'package:qinglong_app/module/login/login_page.dart'; import 'package:qinglong_app/module/task/add_task_page.dart'; import 'package:qinglong_app/module/task/task_bean.dart'; class Routes { static const String route_HomePage = "/home/homepage"; + static const String route_LOGIN = "/login"; static const String route_AddTask = "/task/add"; static const String route_ConfigEdit = "/config/edit"; @@ -14,6 +16,8 @@ class Routes { switch (settings.name) { case route_HomePage: return MaterialPageRoute(builder: (context) => const HomePage()); + case route_LOGIN: + return MaterialPageRoute(builder: (context) => const LoginPage()); case route_AddTask: if (settings.arguments != null) { return CupertinoPageRoute( diff --git a/lib/base/theme.dart b/lib/base/theme.dart index 1055b9f..4270bc7 100644 --- a/lib/base/theme.dart +++ b/lib/base/theme.dart @@ -25,6 +25,9 @@ class ThemeViewModel extends ChangeNotifier { ThemeData darkTheme = ThemeData.dark().copyWith( primaryColor: const Color(0xffffffff), + appBarTheme: const AppBarTheme( + backgroundColor: Colors.black, + ), inputDecorationTheme: const InputDecorationTheme( labelStyle: TextStyle(color: _primaryColor), focusedBorder: UnderlineInputBorder( @@ -41,12 +44,14 @@ ThemeData darkTheme = ThemeData.dark().copyWith( fontSize: 14, ), labelColor: Color(0xffffffff), - unselectedLabelColor: Color(0xff999999), - + unselectedLabelColor: Color(0xff999999), ), + colorScheme: const ColorScheme.light(secondary: _primaryColor,primary: _primaryColor,), ); ThemeData lightTheme = ThemeData.light().copyWith( primaryColor: _primaryColor, + + colorScheme: const ColorScheme.light(secondary: _primaryColor,primary: _primaryColor,), scaffoldBackgroundColor: Colors.white, inputDecorationTheme: const InputDecorationTheme( labelStyle: TextStyle(color: _primaryColor), @@ -76,7 +81,7 @@ ThemeData lightTheme = ThemeData.light().copyWith( fontSize: 14, ), labelColor: _primaryColor, - unselectedLabelColor: Color(0xff999999), + unselectedLabelColor: Color(0xff999999), indicator: UnderlineTabIndicator( borderSide: BorderSide(color: _primaryColor), ), @@ -85,6 +90,7 @@ ThemeData lightTheme = ThemeData.light().copyWith( abstract class ThemeColors { Color taskTitleColor(); + Color descColor(); Color searchBarBg(); diff --git a/lib/main.dart b/lib/main.dart index 626a0cf..cf64079 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,6 +8,7 @@ import 'package:get_it/get_it.dart'; import 'package:logger/logger.dart'; import 'package:qinglong_app/base/theme.dart'; import 'package:qinglong_app/module/login/login_page.dart'; +import 'package:qinglong_app/utils/QlNavigatorObserver.dart'; import 'package:qinglong_app/utils/sp_utils.dart'; import 'base/routes.dart'; @@ -23,6 +24,7 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); await SpUtil.getInstance(); getIt.registerSingleton(UserInfoViewModel()); + getIt.registerSingleton(QlNavigatorObserver()); runApp( ProviderScope( @@ -39,7 +41,6 @@ void main() async { } class MyApp extends ConsumerWidget { - const MyApp({Key? key}) : super(key: key); @override @@ -50,6 +51,7 @@ class MyApp extends ConsumerWidget { FocusScope.of(context).requestFocus(FocusNode()); }, child: MaterialApp( + navigatorObservers: [getIt()], navigatorKey: navigatorState, theme: ref.watch(themeProvider).currentTheme, onGenerateRoute: (setting) { diff --git a/lib/module/env/env_page.dart b/lib/module/env/env_page.dart index 37e6091..8ace83c 100644 --- a/lib/module/env/env_page.dart +++ b/lib/module/env/env_page.dart @@ -1,14 +1,14 @@ +import 'package:drag_and_drop_lists/drag_and_drop_lists.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:qinglong_app/base/base_state_widget.dart'; -import 'package:qinglong_app/base/routes.dart'; +import 'package:qinglong_app/base/common_dialog.dart'; import 'package:qinglong_app/base/theme.dart'; import 'package:qinglong_app/base/ui/empty_widget.dart'; -import 'package:qinglong_app/base/ui/menu.dart'; import 'package:qinglong_app/module/env/env_bean.dart'; import 'package:qinglong_app/module/env/env_viewmodel.dart'; -import 'package:qinglong_app/utils/utils.dart'; class EnvPage extends StatefulWidget { const EnvPage({Key? key}) : super(key: key); @@ -18,29 +18,53 @@ class EnvPage extends StatefulWidget { } class _EnvPageState extends State { - String _searchKey = ""; + final TextEditingController _searchController = TextEditingController(); @override Widget build(BuildContext context) { return BaseStateWidget( builder: (ref, model, child) { - return RefreshIndicator( - color: Theme.of(context).primaryColor, - onRefresh: () async { - return model.loadData(false); - }, - child: model.list.isEmpty - ? const EmptyWidget() - : ListView.builder( - keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, - itemBuilder: (context, index) { - EnvBean item = model.list[index]; + List list = []; - return EnvItemCell(item, ref); + for (var value in model.list) { + if (_searchController.text.isEmpty || + (value.name?.contains(_searchController.text) ?? false) || + (value.value?.contains(_searchController.text) ?? false) || + (value.remarks?.contains(_searchController.text) ?? false)) { + list.add(EnvItemCell(value, ref,key: ValueKey(value.sId),)); + } + } + + return model.list.isEmpty + ? const EmptyWidget() + : RefreshIndicator( + color: Theme.of(context).primaryColor, + onRefresh: () async { + return model.loadData(false); + }, + child: ReorderableListView( + header: searchCell(ref), + onReorder: (int oldIndex, int newIndex) { + if (list.length != model.list.length) { + WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { + failDialog(context, "请先清空搜索关键词"); + }); + return; + } + + setState(() { + //交换数据 + if (newIndex > oldIndex) { + newIndex -= 1; + } + final EnvBean item = model.list.removeAt(oldIndex); + model.list.insert(newIndex, item); + model.update(); + }); }, - itemCount: model.list.length, + children: list, ), - ); + ); }, model: envProvider, onReady: (viewModel) { @@ -48,6 +72,50 @@ class _EnvPageState extends State { }, ); } + + Widget searchCell(WidgetRef context) { + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 10, + ), + child: CupertinoSearchTextField( + onSubmitted: (value) { + setState(() {}); + }, + onSuffixTap: () { + _searchController.text = ""; + setState(() {}); + }, + controller: _searchController, + borderRadius: BorderRadius.circular( + 30, + ), + padding: const EdgeInsets.symmetric( + horizontal: 5, + vertical: 5, + ), + suffixInsets: const EdgeInsets.only( + top: 8, + bottom: 8, + right: 15, + ), + prefixInsets: const EdgeInsets.only( + top: 10, + bottom: 6, + left: 15, + ), + placeholderStyle: TextStyle( + fontSize: 14, + color: context.watch(themeProvider).themeColor.descColor(), + ), + style: const TextStyle( + fontSize: 14, + ), + placeholder: "搜索", + ), + ); + } } class EnvItemCell extends StatelessWidget { @@ -58,51 +126,39 @@ class EnvItemCell extends StatelessWidget { @override Widget build(BuildContext context) { - return CupertinoContextMenu( - actions: [ - QLCupertinoContextMenuAction( - child: const Text("编辑"), - onPressed: () { - Navigator.of(context).pop(); - Navigator.of(context).pushNamed(Routes.route_AddTask, arguments: bean); - }, - trailingIcon: CupertinoIcons.pencil_outline, - ), - QLCupertinoContextMenuAction( - child: Text(bean.status! == 0 ? "禁用" : "启用"), - onPressed: () { - Navigator.of(context).pop(); - enableEnv(); - }, - isDestructiveAction: true, - trailingIcon: bean.status! == 0 ? Icons.dnd_forwardslash : Icons.check_circle_outline_sharp, - ), - QLCupertinoContextMenuAction( - child: const Text("删除"), - onPressed: () { - Navigator.of(context).pop(); - delEnv(context, ref); - }, - isDestructiveAction: true, - trailingIcon: CupertinoIcons.delete, - ), - ], - previewBuilder: (context, anima, child) { - return IntrinsicWidth( - child: Material( - color: Colors.transparent, - child: Text( - bean.name ?? "", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: bean.status == 0 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), - fontSize: 18, - ), - ), + return Slidable( + key: ValueKey(bean.sId), + endActionPane: ActionPane( + motion: const ScrollMotion(), + extentRatio: 0.45, + children: [ + SlidableAction( + backgroundColor: Colors.grey, + flex: 1, + onPressed: (_) {}, + foregroundColor: Colors.white, + icon: CupertinoIcons.pencil_outline, ), - ); - }, + SlidableAction( + backgroundColor: Colors.orange, + flex: 1, + onPressed: (_) { + enableEnv(); + }, + foregroundColor: Colors.white, + icon: bean.status == 0 ? Icons.dnd_forwardslash : Icons.check_circle_outline_sharp, + ), + SlidableAction( + backgroundColor: Colors.red, + flex: 1, + onPressed: (_) { + delEnv(context, ref); + }, + foregroundColor: Colors.white, + icon: CupertinoIcons.delete, + ), + ], + ), child: SizedBox( width: MediaQuery.of(context).size.width, child: Column( diff --git a/lib/module/env/env_viewmodel.dart b/lib/module/env/env_viewmodel.dart index c32ea88..30fb65f 100644 --- a/lib/module/env/env_viewmodel.dart +++ b/lib/module/env/env_viewmodel.dart @@ -60,7 +60,7 @@ class EnvViewModel extends BaseViewModel { HttpResponse response = await Api.enableEnv(sId); if (response.success) { - list.firstWhere((element) => element.sId == sId).status = 1; + list.firstWhere((element) => element.sId == sId).status = 0; sortList(); success(); } else { @@ -70,7 +70,7 @@ class EnvViewModel extends BaseViewModel { HttpResponse response = await Api.disableEnv(sId); if (response.success) { - list.firstWhere((element) => element.sId == sId).status = 0; + list.firstWhere((element) => element.sId == sId).status = 1; sortList(); success(); } else { @@ -78,4 +78,7 @@ class EnvViewModel extends BaseViewModel { } } } + void update(){ + // update + } } diff --git a/lib/module/home/home_page.dart b/lib/module/home/home_page.dart index 4eb2d37..af7b55d 100644 --- a/lib/module/home/home_page.dart +++ b/lib/module/home/home_page.dart @@ -89,12 +89,20 @@ class _HomePageState extends ConsumerState { body: IndexedStack( index: _index, children: [ - const TaskPage(), - const EnvPage(), - ConfigPage( - key: configKey, + const Positioned.fill( + child: TaskPage(), + ), + const Positioned.fill( + child: EnvPage(), + ), + Positioned.fill( + child: ConfigPage( + key: configKey, + ), + ), + const Positioned.fill( + child: OtherPage(), ), - const OtherPage(), ], ), bottomNavigationBar: BottomNavigationBar( diff --git a/lib/module/login/login_page.dart b/lib/module/login/login_page.dart index 0a1e0b2..cfd22e6 100644 --- a/lib/module/login/login_page.dart +++ b/lib/module/login/login_page.dart @@ -1,8 +1,8 @@ -import 'package:dio_log/dio_log.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/common_dialog.dart'; +import 'package:qinglong_app/base/http/http.dart'; import 'package:qinglong_app/base/routes.dart'; import 'package:qinglong_app/base/userinfo_viewmodel.dart'; import 'package:qinglong_app/main.dart'; @@ -24,6 +24,7 @@ class _LoginPageState extends State { @override void initState() { super.initState(); + getIt().updateToken(""); } @override @@ -197,6 +198,7 @@ class _LoginPageState extends State { ), ), onPressed: () { + Http.pushedLoginPage = false; Utils.hideKeyBoard(context); getIt().updateHost(_hostController.text); model.login(_userNameController.text, _passwordController.text); @@ -207,7 +209,6 @@ class _LoginPageState extends State { ), ), ), - ], ), ); diff --git a/lib/module/others/other_page.dart b/lib/module/others/other_page.dart index eaceb0a..9f74359 100644 --- a/lib/module/others/other_page.dart +++ b/lib/module/others/other_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:qinglong_app/base/ql_app_bar.dart'; class OtherPage extends StatefulWidget { const OtherPage({Key? key}) : super(key: key); @@ -10,6 +11,14 @@ class OtherPage extends StatefulWidget { class _OtherPageState extends State { @override Widget build(BuildContext context) { - return Scaffold(); + return SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + + + ], + ), + ); } } diff --git a/lib/module/task/task_page.dart b/lib/module/task/task_page.dart index b8969d2..602b465 100644 --- a/lib/module/task/task_page.dart +++ b/lib/module/task/task_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_highlight/theme_map.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/base_state_widget.dart'; import 'package:qinglong_app/base/routes.dart'; @@ -32,42 +33,50 @@ class _TaskPageState extends State { Widget build(BuildContext context) { return BaseStateWidget( builder: (ref, model, child) { - return DefaultTabController( - length: 3, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TabBar( - tabs: const [ - Tab( - text: "全部", - ), - Tab( - text: "正在运行", - ), - Tab( - text: "已禁用", - ), - ], - isScrollable: true, - indicator: AbsUnderlineTabIndicator( - wantWidth: 20, - borderSide: BorderSide( - color: Theme.of(context).primaryColor, - width: 2, - )), - ), - Expanded( - child: TabBarView( + return Column( + mainAxisSize: MainAxisSize.max, + children: [ + searchCell(ref), + Expanded( + child: DefaultTabController( + length: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - body(model, model.list, ref), - body(model, model.running, ref), - body(model, model.disabled, ref), + TabBar( + tabs: const [ + Tab( + text: "全部", + ), + Tab( + text: "正在运行", + ), + Tab( + text: "已禁用", + ), + ], + isScrollable: true, + indicator: AbsUnderlineTabIndicator( + wantWidth: 20, + borderSide: BorderSide( + color: Theme.of(context).primaryColor, + width: 2, + )), + ), + Expanded( + child: TabBarView( + children: [ + body(model, model.list, ref), + body(model, model.running, ref), + body(model, model.disabled, ref), + ], + ), + ), ], ), ), - ], - ), + ), + ], ); }, model: taskProvider, @@ -103,36 +112,43 @@ class _TaskPageState extends State { Widget searchCell(WidgetRef context) { return Container( - color: context.watch(themeProvider).themeColor.searchBarBg(), padding: const EdgeInsets.symmetric( horizontal: 15, vertical: 10, ), child: CupertinoSearchTextField( onSubmitted: (value) { - setState(() { - _searchKey = value; - }); + setState(() {}); }, onSuffixTap: () { _searchController.text = ""; - setState(() { - _searchKey = ""; - }); + setState(() {}); }, controller: _searchController, borderRadius: BorderRadius.circular( 30, ), padding: const EdgeInsets.symmetric( - horizontal: 15, + horizontal: 5, vertical: 5, ), + suffixInsets: const EdgeInsets.only( + top: 8, + bottom: 8, + right: 15, + ), prefixInsets: const EdgeInsets.only( top: 10, bottom: 6, left: 15, ), + placeholderStyle: TextStyle( + fontSize: 14, + color: context.watch(themeProvider).themeColor.descColor(), + ), + style: const TextStyle( + fontSize: 14, + ), placeholder: "搜索", ), ); @@ -364,7 +380,10 @@ class TaskItemCell extends StatelessWidget { content: InTimeLogPage(bean.sId!, bean.status == 0), actions: [ CupertinoDialogAction( - child: const Text("知道了"), + child: Text( + "知道了", + style: TextStyle(color: Theme.of(context).primaryColor), + ), onPressed: () { Navigator.of(context).pop(); }, diff --git a/lib/module/task/task_viewmodel.dart b/lib/module/task/task_viewmodel.dart index 94c7ae2..eb8db83 100644 --- a/lib/module/task/task_viewmodel.dart +++ b/lib/module/task/task_viewmodel.dart @@ -48,7 +48,7 @@ class TaskViewModel extends BaseViewModel { list.firstWhere((element) => element.sId == cron).status = 0; notifyListeners(); } else { - failed(result.message, notify: true); + failToast(result.message, notify: true); } } @@ -58,7 +58,7 @@ class TaskViewModel extends BaseViewModel { list.firstWhere((element) => element.sId == cron).status = 1; notifyListeners(); } else { - failed(result.message, notify: true); + failToast(result.message, notify: true); } } @@ -68,7 +68,7 @@ class TaskViewModel extends BaseViewModel { list.removeWhere((element) => element.sId == id); notifyListeners(); } else { - failed(result.message, notify: true); + failToast(result.message, notify: true); } } diff --git a/lib/utils/QlNavigatorObserver.dart b/lib/utils/QlNavigatorObserver.dart new file mode 100644 index 0000000..09e6ac3 --- /dev/null +++ b/lib/utils/QlNavigatorObserver.dart @@ -0,0 +1,16 @@ +import 'package:flutter/cupertino.dart'; +import 'package:qinglong_app/base/routes.dart'; + +class QlNavigatorObserver extends NavigatorObserver { + bool isInLoginPage = false; + + @override + void didPush(Route route, Route? previousRoute) { + super.didPush(route, previousRoute); + if (Routes.route_LOGIN == route.settings.name) { + isInLoginPage = true; + } else { + isInLoginPage = false; + } + } +} diff --git a/pubspec.lock b/pubspec.lock index 9f312c5..139c25d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -204,6 +204,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "2.0.2" + drag_and_drop_lists: + dependency: "direct main" + description: + name: drag_and_drop_lists + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.3.2+2" fake_async: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 45d2326..b5ec001 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -24,6 +24,7 @@ dependencies: intl: ^0.17.0 get_it: ^7.2.0 flutter_highlight: ^0.7.0 + drag_and_drop_lists: ^0.3.2+2 dev_dependencies: flutter_native_splash: ^1.3.3