visitor_page.dart 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. import 'package:cs_resources/theme/app_colors_theme.dart';
  2. import 'package:cs_resources/theme/theme_config.dart';
  3. import 'package:cs_resources/theme/theme_notifier.dart';
  4. import 'package:flutter/cupertino.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:auto_route/auto_route.dart';
  7. import 'package:hooks_riverpod/hooks_riverpod.dart';
  8. import 'package:plugin_basic/basic_export.dart';
  9. import 'package:plugin_basic/provider/user_config/user_config_service.dart';
  10. import 'package:plugin_platform/engine/cache/local_cache_manager.dart';
  11. import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
  12. import 'package:plugin_platform/engine/directory/directory_util.dart';
  13. import 'package:plugin_platform/engine/image/image_preview.dart';
  14. import 'package:plugin_platform/engine/media/image_picker_utils.dart';
  15. import 'package:plugin_platform/engine/notify/notify_engine.dart';
  16. import 'package:plugin_platform/engine/sp/sp_util.dart';
  17. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  18. import 'package:shared/utils/log_utils.dart';
  19. import 'package:widgets/dialog/app_default_dialog.dart';
  20. import 'package:widgets/ext/ex_widget.dart';
  21. import 'package:widgets/my_load_image.dart';
  22. import 'package:widgets/picker/date_picker_util.dart';
  23. import 'package:widgets/picker/option_pick_util.dart';
  24. import 'package:plugin_platform/platform_export.dart';
  25. import 'visitor_view_model.dart';
  26. @RoutePage()
  27. class VisitorPage extends HookConsumerWidget {
  28. const VisitorPage({Key? key}) : super(key: key);
  29. @override
  30. Widget build(BuildContext context, WidgetRef ref) {
  31. final _userService = UserConfigService.getInstance(ref: ref);
  32. final _userConfig = UserConfigService.getState(ref: ref);
  33. final _viewModel = ref.watch(visitorViewModelProvider.notifier);
  34. Log.d("VisitorPage - build 了");
  35. return Scaffold(
  36. appBar: AppBar(title: Text("Visitor"),systemOverlayStyle: ThemeConfig.getSystemUiOverlayStyleByTheme(context)),
  37. backgroundColor: context.appColors.backgroundDefault,
  38. body: Center(
  39. child: Column(
  40. children: [
  41. Row(
  42. mainAxisAlignment: MainAxisAlignment.spaceAround,
  43. children: [
  44. Text("当前的用户:${_userConfig.userName}"),
  45. ElevatedButton(
  46. onPressed: () {
  47. _userService.setUserInfo("张三");
  48. },
  49. child: Text(
  50. '修改用户信息',
  51. ),
  52. ),
  53. ],
  54. ).marginOnly(top: 10),
  55. Row(
  56. mainAxisAlignment: MainAxisAlignment.spaceAround,
  57. children: [
  58. ElevatedButton(
  59. onPressed: () {
  60. _viewModel.fetchServerTime();
  61. },
  62. child: Text('网络请求'),
  63. ),
  64. ElevatedButton(
  65. onPressed: () {
  66. ToastEngine.show("这是一个吐司气泡");
  67. },
  68. child: Text('吐司/气泡'),
  69. ),
  70. ElevatedButton(
  71. onPressed: () async {
  72. NotifyEngine.showSuccess("操作成功");
  73. await Future.delayed(Duration(seconds: 3));
  74. NotifyEngine.showFailure("操作失败");
  75. await Future.delayed(Duration(seconds: 3));
  76. NotifyEngine.showError("操作错误");
  77. },
  78. child: Text('成功/失败通知'),
  79. ),
  80. ],
  81. ).marginOnly(top: 10),
  82. Row(
  83. mainAxisAlignment: MainAxisAlignment.spaceAround,
  84. children: [
  85. ElevatedButton(
  86. onPressed: () {
  87. DialogEngine.show(
  88. widget: AppDefaultDialog(
  89. //这种布局自己自定义去
  90. title: "提示",
  91. message: "默认的弹窗,自定义的弹窗自己画去",
  92. confirmAction: () {
  93. ToastEngine.show("点击了确定");
  94. },
  95. ));
  96. },
  97. child: Text('弹窗'),
  98. ),
  99. ElevatedButton(
  100. onPressed: () {
  101. DateTime dateTime = DateTime.now();
  102. DatePickerUtil.showCupertinoDatePicker(
  103. mode: CupertinoDatePickerMode.date,
  104. selectedDateTime: dateTime,
  105. onDateTimeChanged: (date) {
  106. dateTime = date;
  107. },
  108. title: "选择日期",
  109. );
  110. },
  111. child: Text('时间选择'),
  112. ),
  113. ElevatedButton(
  114. onPressed: () {
  115. OptionPickerUtil.showCupertinoOptionPicker(
  116. items: ["前天", "昨天", "今天", "明天", "后天"],
  117. initialSelectIndex: 0,
  118. onPickerChanged: (_, index) {
  119. ToastEngine.show("选中的索引为:$index");
  120. },
  121. );
  122. },
  123. child: Text('条件选择'),
  124. ),
  125. ],
  126. ).marginOnly(top: 10),
  127. Row(
  128. mainAxisAlignment: MainAxisAlignment.spaceAround,
  129. children: [
  130. ElevatedButton(
  131. onPressed: () {
  132. ImagePickerUtils().show(context, (filePath) {
  133. ToastEngine.show("图片的路径为:$filePath");
  134. });
  135. },
  136. child: Text('相册/相册'),
  137. ),
  138. ElevatedButton(
  139. onPressed: () async {
  140. final PermissionStatus permissionStatus = await Permission.phone.request();
  141. if (permissionStatus.isGranted) {
  142. final Uri launchUri = Uri(
  143. scheme: 'tel',
  144. path: "+8618571458165",
  145. );
  146. await launchUrl(launchUri);
  147. } else {
  148. // 权限被拒绝
  149. ToastEngine.show('Phone call permission denied');
  150. }
  151. },
  152. child: Text('App动态权限'),
  153. ),
  154. ],
  155. ).marginOnly(top: 10),
  156. Row(
  157. mainAxisAlignment: MainAxisAlignment.spaceAround,
  158. children: [
  159. ElevatedButton(
  160. onPressed: () async {
  161. final tempPath = DirectoryUtil.getTempPath();
  162. final docPath = DirectoryUtil.getAppDocPath();
  163. final appSupportPath = DirectoryUtil.getAppSupportPath();
  164. final storagePath = DirectoryUtil.getStoragePath(); //只能拿沙盒路径,外置SD卡是拿不到的
  165. final cacheSize = await DirectoryUtil.getAppCacheSize();
  166. Log.d("沙盒路径 - tempPath:$tempPath docPath:$docPath appSupportPath:$appSupportPath storagePath:$storagePath "
  167. "cacheSize:$cacheSize");
  168. },
  169. child: Text('沙盒路径'),
  170. ),
  171. ElevatedButton(
  172. onPressed: () async {
  173. //Key-Value的重要信息持久化缓存(只存小东西如配置,token)
  174. await SPUtil.putBool("isVip", true);
  175. final isVip = SPUtil.getBool("isVip", defValue: false);
  176. Log.d("存入并取出SP的值 - isVip:$isVip");
  177. //沙盒缓存文件缓存(可存入对象,大文本,Json,网络请求数据)
  178. await localCache.put("name", "李四", expiry: const Duration(seconds: 10));
  179. await localCache.put("age", 28, expiry: const Duration(seconds: 10));
  180. await localCache.put("gender", 1);
  181. await localCache.put("skills", ["游泳", "跑步", "编程"]);
  182. await localCache.put("json", {"code": "200", "msg": "Success", "data": 2});
  183. String? name = await localCache.get("name");
  184. int? age = await localCache.get("age");
  185. int? gender = await localCache.get("gender");
  186. List<String>? skills = await localCache.get("skills");
  187. Map<String, dynamic>? json = await localCache.get("json");
  188. Log.d("获取缓存name:$name");
  189. Log.d("获取缓存age:$age");
  190. Log.d("获取缓存gender:$gender");
  191. Log.d("获取缓存skills:$skills");
  192. Log.d("获取缓存json:$json");
  193. },
  194. child: Text('缓存用法'),
  195. ),
  196. ElevatedButton(
  197. onPressed: () {},
  198. child: Text('图片预览'),
  199. ),
  200. ],
  201. ).marginOnly(top: 10),
  202. Row(
  203. mainAxisAlignment: MainAxisAlignment.spaceAround,
  204. children: [
  205. ElevatedButton(
  206. onPressed: () {},
  207. child: Text('图片加载'),
  208. ),
  209. Hero(
  210. tag: '112cc8a34e13',
  211. child: MyLoadImage("https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", width: 80, height: 80),
  212. ),
  213. ElevatedButton(
  214. onPressed: () {
  215. //单图预览,支持hero
  216. ImagePreviewEngine.singleImagePreview(context, "https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws", heroTag: '112cc8a34e13');
  217. //多图预览,支持hero
  218. // ImagePreviewEngine.multipleImagePreview(context, "https://pic.quanjing.com/cz/8s/QJ8856274343.jpg@%21794ws");
  219. },
  220. child: Text('图片预览'),
  221. ),
  222. ],
  223. ).marginOnly(top: 10),
  224. Row(
  225. mainAxisAlignment: MainAxisAlignment.spaceAround,
  226. children: [
  227. ElevatedButton(
  228. onPressed: () {
  229. ref.read(themeProvider.notifier).toggleTheme();
  230. },
  231. child: Text('手动切换主题'),
  232. style: ButtonStyle(
  233. backgroundColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
  234. // 设置按钮的背景颜色
  235. foregroundColor: WidgetStateProperty.all<Color>(Colors.white),
  236. // 设置按钮文字的颜色
  237. shadowColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
  238. // 按钮阴影颜色
  239. elevation: WidgetStateProperty.all<double>(5),
  240. // 按钮阴影的高度
  241. shape: WidgetStateProperty.all<RoundedRectangleBorder>(
  242. RoundedRectangleBorder(
  243. borderRadius: BorderRadius.circular(30), // 圆角边框
  244. ),
  245. ),
  246. ),
  247. ),
  248. ElevatedButton(
  249. onPressed: () {
  250. ref.read(themeProvider.notifier).followSystemTheme();
  251. },
  252. child: Text('跟随系统主题'),
  253. style: ButtonStyle(
  254. backgroundColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
  255. // 设置按钮的背景颜色
  256. foregroundColor: WidgetStateProperty.all<Color>(Colors.white),
  257. // 设置按钮文字的颜色
  258. shadowColor: WidgetStateProperty.all<Color>(context.appColors.btnBgDefault),
  259. // 按钮阴影颜色
  260. elevation: WidgetStateProperty.all<double>(5),
  261. // 按钮阴影的高度
  262. shape: WidgetStateProperty.all<RoundedRectangleBorder>(
  263. RoundedRectangleBorder(
  264. borderRadius: BorderRadius.circular(30), // 圆角边框
  265. ),
  266. ),
  267. ),
  268. ),
  269. ],
  270. ).marginOnly(top: 10),
  271. ],
  272. ),
  273. ),
  274. );
  275. }
  276. }