From e68fff867ebec79d36859d1e85375a31984be346 Mon Sep 17 00:00:00 2001 From: jyuesong <425698907@qq.com> Date: Mon, 17 Jan 2022 17:25:49 +0800 Subject: [PATCH] add theme --- lib/base/routes.dart | 12 ++ lib/module/config/config_page.dart | 3 + lib/module/env/add_env_page.dart | 199 +++++++++++++++++++ lib/module/env/env_page.dart | 206 ++++++++++---------- lib/module/home/home_page.dart | 20 +- lib/module/task/task_page.dart | 300 +++++++++++++++-------------- 6 files changed, 494 insertions(+), 246 deletions(-) create mode 100644 lib/module/env/add_env_page.dart diff --git a/lib/base/routes.dart b/lib/base/routes.dart index ed711e1..1c2895e 100644 --- a/lib/base/routes.dart +++ b/lib/base/routes.dart @@ -1,6 +1,8 @@ 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/env/add_env_page.dart'; +import 'package:qinglong_app/module/env/env_bean.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'; @@ -10,6 +12,7 @@ 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_AddEnv = "/env/add"; static const String route_ConfigEdit = "/config/edit"; static Route? generateRoute(RouteSettings settings) { @@ -27,6 +30,15 @@ class Routes { } else { return CupertinoPageRoute(builder: (context) => const AddTaskPage()); } + case route_AddEnv: + if (settings.arguments != null) { + return CupertinoPageRoute( + builder: (context) => AddEnvPage( + taskBean: settings.arguments as EnvBean, + )); + } else { + return CupertinoPageRoute(builder: (context) => const AddEnvPage()); + } case route_ConfigEdit: return CupertinoPageRoute( builder: (context) => ConfigEditPage( diff --git a/lib/module/config/config_page.dart b/lib/module/config/config_page.dart index f81fec7..d5ef862 100644 --- a/lib/module/config/config_page.dart +++ b/lib/module/config/config_page.dart @@ -57,6 +57,9 @@ class ConfigPageState extends State with SingleTickerProviderStateMi child: HighlightView( model.content[e.title] ?? "", language: "sh", + padding: const EdgeInsets.symmetric( + horizontal: 15, + ), theme: ref.watch(themeProvider).themeColor.codeEditorTheme(), tabSize: 14, ), diff --git a/lib/module/env/add_env_page.dart b/lib/module/env/add_env_page.dart new file mode 100644 index 0000000..32c3671 --- /dev/null +++ b/lib/module/env/add_env_page.dart @@ -0,0 +1,199 @@ +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/api.dart'; +import 'package:qinglong_app/base/http/http.dart'; +import 'package:qinglong_app/base/ql_app_bar.dart'; +import 'package:qinglong_app/module/env/env_bean.dart'; +import 'package:qinglong_app/module/env/env_viewmodel.dart'; +import 'package:qinglong_app/module/task/task_bean.dart'; +import 'package:qinglong_app/module/task/task_detail/task_detail_bean.dart'; +import 'package:qinglong_app/module/task/task_viewmodel.dart'; + +class AddEnvPage extends ConsumerStatefulWidget { + final EnvBean? taskBean; + + const AddEnvPage({Key? key, this.taskBean}) : super(key: key); + + @override + ConsumerState createState() => _AddEnvPageState(); +} + +class _AddEnvPageState extends ConsumerState { + late EnvBean envBean; + + final TextEditingController _nameController = TextEditingController(); + final TextEditingController _valueController = TextEditingController(); + final TextEditingController _remarkController = TextEditingController(); + + @override + void initState() { + super.initState(); + if (widget.taskBean != null) { + envBean = widget.taskBean!; + _nameController.text = envBean.name ?? ""; + _valueController.text = envBean.value ?? ""; + _remarkController.text = envBean.remarks ?? ""; + } else { + envBean = EnvBean(); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: QlAppBar( + canBack: true, + backCall: () { + Navigator.of(context).pop(); + }, + title: envBean.name == null ? "新增环境变量" : "编辑环境变量", + actions: [ + InkWell( + onTap: () { + submit(); + }, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 15, + ), + child: Center( + child: Text("提交"), + ), + ), + ) + ], + ), + body: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 15, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 10, + ), + const Text( + "名称:", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox( + height: 10, + ), + TextField( + controller: _nameController, + decoration: const InputDecoration( + contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), + hintText: "请输入名称", + ), + autofocus: false, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 15, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 10, + ), + const Text( + "值:", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox( + height: 10, + ), + TextField( + controller: _valueController, + maxLines: 8, + minLines: 1, + decoration: const InputDecoration( + contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), + hintText: "请输入值", + ), + autofocus: false, + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 15, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 10, + ), + const Text( + "备注:", + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + ), + ), + const SizedBox( + height: 10, + ), + TextField( + controller: _remarkController, + decoration: const InputDecoration( + contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5), + hintText: "请输入备注", + ), + autofocus: false, + ), + ], + ), + ), + ], + ), + ); + } + + void submit() async { + if (_nameController.text.isEmpty) { + failDialog(context, "名称不能为空"); + return; + } + if (_valueController.text.isEmpty) { + failDialog(context, "值不能为空"); + return; + } + + envBean.name = _nameController.text; + envBean.value = _valueController.text; + envBean.remarks = _remarkController.text; + HttpResponse response = await Api.addEnv(_nameController.text, _valueController.text, _remarkController.text, id: envBean.sId); + + if (response.success) { + successDialog(context, "操作成功").then((value) { + ref.read(envProvider).updateEnv(envBean); + Navigator.of(context).pop(); + }); + } else { + failDialog(context, response.message ?? ""); + } + } +} diff --git a/lib/module/env/env_page.dart b/lib/module/env/env_page.dart index 8ace83c..80ee625 100644 --- a/lib/module/env/env_page.dart +++ b/lib/module/env/env_page.dart @@ -5,6 +5,7 @@ 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/common_dialog.dart'; +import 'package:qinglong_app/base/routes.dart'; import 'package:qinglong_app/base/theme.dart'; import 'package:qinglong_app/base/ui/empty_widget.dart'; import 'package:qinglong_app/module/env/env_bean.dart'; @@ -31,7 +32,11 @@ class _EnvPageState extends State { (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),)); + list.add(EnvItemCell( + value, + ref, + key: ValueKey(value.sId), + )); } } @@ -126,112 +131,117 @@ class EnvItemCell extends StatelessWidget { @override Widget build(BuildContext context) { - 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( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, + return ColoredBox( + color: ref.watch(themeProvider).themeColor.settingBgColor(), + child: Slidable( + key: ValueKey(bean.sId), + endActionPane: ActionPane( + motion: const ScrollMotion(), + extentRatio: 0.45, children: [ - Container( - padding: const EdgeInsets.symmetric( - horizontal: 15, - vertical: 8, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: Material( - color: Colors.transparent, - child: Text( - bean.name ?? "", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: bean.status == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), - fontSize: 18, + SlidableAction( + backgroundColor: Colors.grey, + flex: 1, + onPressed: (_) { + Navigator.of(context).pushNamed(Routes.route_AddEnv, arguments: bean); + }, + foregroundColor: Colors.white, + icon: CupertinoIcons.pencil, + ), + 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( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 8, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Material( + color: Colors.transparent, + child: Text( + bean.name ?? "", + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: bean.status == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), + fontSize: 18, + ), ), ), ), - ), - const SizedBox( - width: 5, - ), - Material( - color: Colors.transparent, - child: Text( - bean.remarks ?? "-", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: ref.watch(themeProvider).themeColor.descColor(), - fontSize: 12, + const SizedBox( + width: 5, + ), + Material( + color: Colors.transparent, + child: Text( + bean.remarks ?? "-", + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: ref.watch(themeProvider).themeColor.descColor(), + fontSize: 12, + ), ), ), - ), - ], - ), - const SizedBox( - height: 8, - ), - Material( - color: Colors.transparent, - child: Text( - bean.value ?? "", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: ref.watch(themeProvider).themeColor.descColor(), - fontSize: 12, + ], + ), + const SizedBox( + height: 8, + ), + Material( + color: Colors.transparent, + child: Text( + bean.value ?? "", + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: ref.watch(themeProvider).themeColor.descColor(), + fontSize: 12, + ), ), ), - ), - ], + ], + ), ), - ), - const Divider( - height: 1, - indent: 15, - ), - ], + const Divider( + height: 1, + indent: 15, + ), + ], + ), ), ), ); diff --git a/lib/module/home/home_page.dart b/lib/module/home/home_page.dart index 3ea0bf4..606d6c4 100644 --- a/lib/module/home/home_page.dart +++ b/lib/module/home/home_page.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:qinglong_app/base/ql_app_bar.dart'; import 'package:qinglong_app/base/routes.dart'; -import 'package:qinglong_app/base/theme.dart'; import 'package:qinglong_app/module/config/config_page.dart'; import 'package:qinglong_app/module/env/env_page.dart'; import 'package:qinglong_app/module/others/other_page.dart'; @@ -54,6 +53,25 @@ class _HomePageState extends ConsumerState { ), ), )); + } else if (_index == 1) { + actions.add(InkWell( + onTap: () { + Navigator.of(context).pushNamed( + Routes.route_AddEnv, + ); + }, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 15, + ), + child: Center( + child: Icon( + CupertinoIcons.add, + size: 20, + ), + ), + ), + )); } else if (_index == 2) { actions.add(InkWell( onTap: () { diff --git a/lib/module/task/task_page.dart b/lib/module/task/task_page.dart index 602b465..95bcdd8 100644 --- a/lib/module/task/task_page.dart +++ b/lib/module/task/task_page.dart @@ -99,7 +99,10 @@ class _TaskPageState extends State { itemBuilder: (context, index) { TaskBean item = list[index]; - if ((item.name == null || item.name!.contains(_searchKey ?? "")) || (item.command == null || item.command!.contains(_searchKey ?? ""))) { + if (_searchController.text.isEmpty || + (item.name?.contains(_searchController.text) ?? false) || + (item.command?.contains(_searchController.text) ?? false) || + (item.schedule?.contains(_searchController.text) ?? false)) { return TaskItemCell(item, ref); } else { return const SizedBox.shrink(); @@ -163,157 +166,160 @@ class TaskItemCell extends StatelessWidget { @override Widget build(BuildContext context) { - return CupertinoContextMenu( - actions: [ - QLCupertinoContextMenuAction( - child: Text( - bean.status! == 1 ? "运行" : "停止运行", - ), - trailingIcon: bean.status! == 1 ? CupertinoIcons.memories : CupertinoIcons.stop_circle, - onPressed: () { - Navigator.of(context).pop(); - startCron(context, ref); - }, - ), - QLCupertinoContextMenuAction( - child: const Text("查看日志"), - onPressed: () { - Navigator.of(context).pop(); - logCron(context, ref); - }, - trailingIcon: CupertinoIcons.clock, - ), - 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.isPinned! == 0 ? "置顶" : "取消置顶"), - onPressed: () { - Navigator.of(context).pop(); - pinTask(); - }, - trailingIcon: bean.isPinned! == 0 ? CupertinoIcons.pin : CupertinoIcons.pin_slash, - ), - QLCupertinoContextMenuAction( - child: Text(bean.isDisabled! == 0 ? "禁用" : "启用"), - onPressed: () { - Navigator.of(context).pop(); - enableTask(); - }, - isDestructiveAction: true, - trailingIcon: bean.isDisabled! == 0 ? Icons.dnd_forwardslash : Icons.check_circle_outline_sharp, - ), - QLCupertinoContextMenuAction( - child: const Text("删除"), - onPressed: () { - Navigator.of(context).pop(); - delTask(context, ref); - }, - isDestructiveAction: true, - trailingIcon: CupertinoIcons.delete, - ), - ], - previewBuilder: (context, anima, child) { - return IntrinsicWidth( - child: Material( - color: Colors.transparent, + return ColoredBox( + color: ref.watch(themeProvider).themeColor.settingBgColor(), + child: CupertinoContextMenu( + actions: [ + QLCupertinoContextMenuAction( child: Text( - bean.name ?? "", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: bean.isDisabled == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), - fontSize: 18, - ), + bean.status! == 1 ? "运行" : "停止运行", ), + trailingIcon: bean.status! == 1 ? CupertinoIcons.memories : CupertinoIcons.stop_circle, + onPressed: () { + Navigator.of(context).pop(); + startCron(context, ref); + }, ), - ); - }, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - color: bean.isPinned == 1 ? ref.watch(themeProvider).themeColor.pinColor() : Colors.transparent, - padding: const EdgeInsets.symmetric( - horizontal: 15, - vertical: 8, - ), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Material( - color: Colors.transparent, - child: Text( - bean.name ?? "", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: bean.isDisabled == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), - fontSize: 18, - ), - ), - ), - const SizedBox( - width: 5, - ), - bean.status == 1 - ? const SizedBox.shrink() - : const SizedBox( - width: 15, - height: 15, - child: CircularProgressIndicator( - strokeWidth: 2, - ), - ), - const Spacer(), - Material( - color: Colors.transparent, - child: Text( - (bean.lastExecutionTime == null || bean.lastExecutionTime == 0) ? "-" : Utils.formatMessageTime(bean.lastExecutionTime!), - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: ref.watch(themeProvider).themeColor.descColor(), - fontSize: 12, - ), - ), - ), - ], - ), - const SizedBox( - height: 8, - ), - Material( - color: Colors.transparent, - child: Text( - bean.schedule ?? "", - maxLines: 1, - style: TextStyle( - overflow: TextOverflow.ellipsis, - color: ref.watch(themeProvider).themeColor.descColor(), - fontSize: 12, - ), - ), - ), - ], - ), + QLCupertinoContextMenuAction( + child: const Text("查看日志"), + onPressed: () { + Navigator.of(context).pop(); + logCron(context, ref); + }, + trailingIcon: CupertinoIcons.clock, ), - const Divider( - height: 1, - indent: 15, + 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.isPinned! == 0 ? "置顶" : "取消置顶"), + onPressed: () { + Navigator.of(context).pop(); + pinTask(); + }, + trailingIcon: bean.isPinned! == 0 ? CupertinoIcons.pin : CupertinoIcons.pin_slash, + ), + QLCupertinoContextMenuAction( + child: Text(bean.isDisabled! == 0 ? "禁用" : "启用"), + onPressed: () { + Navigator.of(context).pop(); + enableTask(); + }, + isDestructiveAction: true, + trailingIcon: bean.isDisabled! == 0 ? Icons.dnd_forwardslash : Icons.check_circle_outline_sharp, + ), + QLCupertinoContextMenuAction( + child: const Text("删除"), + onPressed: () { + Navigator.of(context).pop(); + delTask(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.isDisabled == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), + fontSize: 18, + ), + ), + ), + ); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + color: bean.isPinned == 1 ? ref.watch(themeProvider).themeColor.pinColor() : Colors.transparent, + padding: const EdgeInsets.symmetric( + horizontal: 15, + vertical: 8, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Material( + color: Colors.transparent, + child: Text( + bean.name ?? "", + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: bean.isDisabled == 1 ? const Color(0xffF85152) : ref.watch(themeProvider).themeColor.taskTitleColor(), + fontSize: 18, + ), + ), + ), + const SizedBox( + width: 5, + ), + bean.status == 1 + ? const SizedBox.shrink() + : const SizedBox( + width: 15, + height: 15, + child: CircularProgressIndicator( + strokeWidth: 2, + ), + ), + const Spacer(), + Material( + color: Colors.transparent, + child: Text( + (bean.lastExecutionTime == null || bean.lastExecutionTime == 0) ? "-" : Utils.formatMessageTime(bean.lastExecutionTime!), + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: ref.watch(themeProvider).themeColor.descColor(), + fontSize: 12, + ), + ), + ), + ], + ), + const SizedBox( + height: 8, + ), + Material( + color: Colors.transparent, + child: Text( + bean.schedule ?? "", + maxLines: 1, + style: TextStyle( + overflow: TextOverflow.ellipsis, + color: ref.watch(themeProvider).themeColor.descColor(), + fontSize: 12, + ), + ), + ), + ], + ), + ), + const Divider( + height: 1, + indent: 15, + ), + ], + ), ), ); } @@ -380,7 +386,7 @@ class TaskItemCell extends StatelessWidget { content: InTimeLogPage(bean.sId!, bean.status == 0), actions: [ CupertinoDialogAction( - child: Text( + child: Text( "知道了", style: TextStyle(color: Theme.of(context).primaryColor), ),