setting_page.dart 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. import 'dart:async';
  2. import 'dart:math';
  3. import 'package:flustars/flustars.dart' as f;
  4. import 'package:flustars/flustars.dart' as FlutterStars;
  5. import 'package:flutter/cupertino.dart';
  6. import 'package:flutter/material.dart';
  7. import 'package:flutter_screenutil/flutter_screenutil.dart';
  8. import 'package:fluwx/fluwx.dart' as fluwx;
  9. import 'package:liftmanager/cache/cache_manager.dart';
  10. import 'package:liftmanager/common/common.dart';
  11. import 'package:liftmanager/common/user_db.dart';
  12. import 'package:liftmanager/internal/account/account_router.dart';
  13. import 'package:liftmanager/internal/account/model/user_info_entity.dart';
  14. import 'package:liftmanager/internal/bbs/provide/websocket.dart';
  15. import 'package:liftmanager/internal/wode/model/version_item.dart';
  16. import 'package:liftmanager/internal/wode/page/user_xieyi.dart';
  17. import 'package:liftmanager/internal/wode/wode_router.dart';
  18. import 'package:liftmanager/net/api_service.dart';
  19. import 'package:liftmanager/routers/fluro_navigator.dart';
  20. import 'package:liftmanager/utils/fast_notification.dart';
  21. import 'package:liftmanager/utils/theme_utils.dart';
  22. import 'package:liftmanager/utils/toast.dart';
  23. import 'package:liftmanager/widgets/app_bar.dart';
  24. import 'package:liftmanager/widgets/click_item.dart';
  25. import 'package:liftmanager/widgets/load_image.dart';
  26. import 'package:liftmanager/widgets/update_dialog.dart';
  27. import 'package:package_info/package_info.dart';
  28. import 'package:provider/provider.dart';
  29. class SettingPage extends StatefulWidget {
  30. SettingPage(this.indexNow);
  31. final String indexNow;
  32. @override
  33. State<StatefulWidget> createState() {
  34. return SettingPageState();
  35. }
  36. }
  37. class SettingPageState extends State<SettingPage> {
  38. WebSocketProvide provider = WebSocketProvide();
  39. int indexNow;
  40. String checkFalse = "tab_first/check_false";
  41. String checkTrue = "tab_first/check_true";
  42. StreamSubscription<fluwx.WeChatAuthResponse> _wxlogin;
  43. VersionItem versionItem = VersionItem();
  44. PackageInfo packageInfo;
  45. bool _isWechatInstalled = false;
  46. UserInfoEntity userInfoEntity = UserInfoEntity();
  47. String sizeStr = "";
  48. // void removeSocket () async{
  49. // SharedPreferences prefs = await SharedPreferences.getInstance();
  50. // prefs.remove("sessionIdObj");
  51. // }
  52. @override
  53. void initState() {
  54. if (mounted) {
  55. setState(() {
  56. indexNow = int.tryParse(widget.indexNow);
  57. });
  58. }
  59. super.initState();
  60. _initFluwx();
  61. getSize();
  62. getInfo();
  63. _wxlogin = fluwx.responseFromAuth.listen((res) {
  64. switch (res.errCode) {
  65. case -4:
  66. {
  67. //拒绝
  68. toasts("已拒绝");
  69. break;
  70. }
  71. case -2:
  72. {
  73. //取消
  74. toasts("已取消");
  75. break;
  76. }
  77. case 0:
  78. {
  79. if (res.type != 2) {
  80. bindMobile(res.code);
  81. }
  82. break;
  83. }
  84. }
  85. });
  86. getUserInfo();
  87. getNewVersion();
  88. }
  89. getNewVersion() {
  90. ApiService(context: context).version(onSuccess: (res) {
  91. if (res != null) {
  92. versionItem = res;
  93. setState(() {});
  94. }
  95. }, onError: (code, msg) {
  96. toasts(msg);
  97. });
  98. }
  99. getInfo() async {
  100. packageInfo = await PackageInfo.fromPlatform();
  101. }
  102. _initFluwx() async {
  103. await fluwx.registerWxApi(
  104. appId: "wx0f10e6386fb9969e",
  105. doOnAndroid: true,
  106. doOnIOS: true,
  107. universalLink: "https://www.edtyun.com/");
  108. var result = await fluwx.isWeChatInstalled();
  109. _isWechatInstalled = result;
  110. setState(() {});
  111. }
  112. void getUserInfo() {
  113. ApiService(context: context).userInfo(
  114. onSuccess: (data) {
  115. userInfoEntity = data;
  116. setState(() {});
  117. },
  118. onError: (code, msg) {});
  119. }
  120. bindMobile(authCode) {
  121. ApiService(context: context).accountAppBindMobile(authCode,
  122. onSuccess: (res) {
  123. userInfoEntity.wxBindFlag = true;
  124. setState(() {});
  125. }, onError: (code, msg) {
  126. toasts(msg);
  127. });
  128. }
  129. getSize() async {
  130. int size = await getCacheSize();
  131. if (size < 1024) {
  132. sizeStr = "${size}Kb";
  133. } else if (size < 1024 * 1024) {
  134. sizeStr = "${size / 1024}Mb";
  135. }
  136. }
  137. void _showUpdateDialog() {
  138. showDialog(
  139. context: context,
  140. barrierDismissible: false,
  141. builder: (BuildContext context) {
  142. return UpdateDialog(
  143. content: versionItem.content,
  144. url: versionItem.url,
  145. version: versionItem.version,
  146. forceUpdate: versionItem.forceUpdate == 1 ? true : false,
  147. );
  148. });
  149. }
  150. @override
  151. void dispose() {
  152. // TODO: implement dispose
  153. super.dispose();
  154. _wxlogin.cancel();
  155. }
  156. updateUser(alipayAccount) {
  157. NewApiService().updateUser({
  158. "userId": FlutterStars.SpUtil.getString(Constant.userId),
  159. "showWhichName": alipayAccount
  160. }, onSuccess: (res) {
  161. String initThisUserInfomation = randomInt(1111, 9999).toString() +
  162. DateTime.now().millisecondsSinceEpoch.toString();
  163. FastNotification.push("initUserInfomation", initThisUserInfomation);
  164. setState(() {});
  165. }, onError: (code, msg) {
  166. toasts(msg);
  167. });
  168. }
  169. randomInt(int min, int max) {
  170. return new Random().nextInt(max) % (max - min + 1) + min;
  171. }
  172. @override
  173. Widget build(BuildContext context) {
  174. double width = MediaQuery.of(context).size.width;
  175. String theme = FlutterStars.SpUtil.getString(Constant.theme);
  176. String themeMode;
  177. switch (theme) {
  178. case "Dark":
  179. themeMode = "开启";
  180. break;
  181. case "Light":
  182. themeMode = "关闭";
  183. break;
  184. default:
  185. themeMode = "跟随系统";
  186. break;
  187. }
  188. return Scaffold(
  189. resizeToAvoidBottomPadding: false,
  190. appBar: MyAppBar(
  191. centerTitle: "系统设置",
  192. ),
  193. body: Stack(children: <Widget>[
  194. Container(
  195. // padding: EdgeInsets.only(top:70),
  196. child: ListView(children: <Widget>[
  197. Container(
  198. decoration: BoxDecoration(
  199. border: Border(
  200. bottom: BorderSide(width: 1, color: Color(0xfff5f5f5)),
  201. ),
  202. ),
  203. padding: EdgeInsets.only(
  204. left: ScreenUtil().setWidth(15),
  205. right: ScreenUtil().setWidth(15)),
  206. height: ScreenUtil().setWidth(60),
  207. child: Row(
  208. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  209. children: <Widget>[
  210. Text(
  211. "昵称/名称切换",
  212. style: TextStyle(
  213. // fontSize:ScreenUtil().setSp(14)
  214. ),
  215. textAlign: TextAlign.start,
  216. ),
  217. Row(
  218. children: <Widget>[
  219. GestureDetector(
  220. child: Container(
  221. // padding: EdgeInsets.only(top:10,left:5,right:5,bottom:10),
  222. child: Row(children: <Widget>[
  223. LoadAssetImage(
  224. // image: AssetImage(i['img']),
  225. indexNow == 1 ? checkTrue : checkFalse,
  226. width: ScreenUtil().setWidth(20),
  227. height: ScreenUtil().setWidth(20),
  228. // alignment: Alignment.centerLeft,
  229. ),
  230. Container(width: 5, child: null),
  231. Text(
  232. "昵称",
  233. style: TextStyle(
  234. // color:Color(0xff000000),
  235. // fontSize:ScreenUtil().setSp(14)
  236. ),
  237. textAlign: TextAlign.start,
  238. ),
  239. ])),
  240. onTap: () {
  241. setState(() {
  242. indexNow = 1;
  243. updateUser(1);
  244. });
  245. print(indexNow);
  246. },
  247. ),
  248. Container(width: 15, child: null),
  249. GestureDetector(
  250. child: Container(
  251. // padding: EdgeInsets.only(top:10,left:5,right:5,bottom:10),
  252. child: Row(children: <Widget>[
  253. LoadAssetImage(
  254. // image: AssetImage(i['img']),
  255. indexNow == 2 ? checkTrue : checkFalse,
  256. width: ScreenUtil().setWidth(20),
  257. height: ScreenUtil().setWidth(20),
  258. // alignment: Alignment.centerLeft,
  259. ),
  260. Container(width: 5, child: null),
  261. Text(
  262. "名称",
  263. style: TextStyle(
  264. // color:Colors.black,
  265. // fontSize:ScreenUtil().setSp(14)
  266. ),
  267. textAlign: TextAlign.start,
  268. ),
  269. ])),
  270. onTap: () {
  271. setState(() {
  272. indexNow = 2;
  273. updateUser(2);
  274. });
  275. print(indexNow);
  276. },
  277. ),
  278. ],
  279. ),
  280. ])),
  281. // ClickItem(title: "修改密码", content: "",onTap: (){
  282. // // NavigatorUtils.push(context, BbsRouter.videoDetail);
  283. // },),
  284. // ClickItem(title: "帮助与反馈", content: "",onTap: (){
  285. // // NavigatorUtils.push(context, BbsRouter.videoDetail);
  286. // },),
  287. ClickItem(
  288. title: "清理缓存",
  289. content: sizeStr,
  290. onTap: () {
  291. showAlert(
  292. context,
  293. "提示",
  294. "清除所有的保养暂存记录?",
  295. "清除",
  296. () {
  297. NavigatorUtils.goBack(context);
  298. clearCache();
  299. getSize();
  300. toasts("已清除");
  301. },
  302. txt2: "取消",
  303. onPre2: () {
  304. NavigatorUtils.goBack(context);
  305. });
  306. },
  307. ),
  308. Offstage(
  309. offstage: !_isWechatInstalled,
  310. child: ClickItem(
  311. title: "微信绑定",
  312. content: userInfoEntity.wxBindFlag ? '已绑定' : '未绑定',
  313. onTap: () {
  314. if (userInfoEntity.wxBindFlag) {
  315. return;
  316. }
  317. fluwx.sendWeChatAuth(
  318. scope: "snsapi_userinfo",
  319. );
  320. },
  321. )),
  322. // ClickItem(
  323. // title: "夜间模式",
  324. // content: themeMode,
  325. // onTap: () =>
  326. // NavigatorUtils.push(context, WodeRouter.themePage)),
  327. ClickItem(
  328. title: "版本",
  329. content: packageInfo?.version ?? "",
  330. onTap: () {
  331. if (hasNewVersion(packageInfo?.version, versionItem.version)) {
  332. _showUpdateDialog();
  333. } else {
  334. toasts("已是最新版本。");
  335. }
  336. },
  337. ),
  338. ClickItem(title: "联系我们", content: "tykj@liftyun.com"),
  339. ClickItem(
  340. title: "用户协议",
  341. content: "",
  342. onTap: () => Navigator.of(context).push(
  343. MaterialPageRoute(builder: (context) => UserXieyiPage()))),
  344. ])),
  345. Positioned(
  346. bottom: 0,
  347. left: 0,
  348. child: Container(
  349. width: width,
  350. padding: EdgeInsets.only(
  351. top: ScreenUtil().setWidth(15),
  352. bottom: ScreenUtil().setWidth(15),
  353. left: ScreenUtil().setWidth(25),
  354. right: ScreenUtil().setWidth(25)),
  355. color: ThemeUtils.getTabsBg(context),
  356. child: Container(
  357. height: ScreenUtil().setWidth(44),
  358. decoration: BoxDecoration(
  359. borderRadius:
  360. BorderRadius.circular(ScreenUtil().setWidth(22)),
  361. border: Border.all(
  362. width: 0.5,
  363. color: Colors.black,
  364. )),
  365. child: FlatButton(
  366. // padding: EdgeInsets.all(15.0),
  367. child: Text("退出登录"),
  368. // textColor: Colors.white,
  369. onPressed: () {
  370. showAlert(
  371. context,
  372. "提示",
  373. "是否确定退出?",
  374. "确定",
  375. () {
  376. User().clearUser();
  377. FlutterStars.SpUtil.putBool('isInitLink', false);
  378. Provider.of<WebSocketProvide>(context,
  379. listen: false)
  380. .cancelTimer();
  381. Provider.of<WebSocketProvide>(context,
  382. listen: false)
  383. .closeWebSocket();
  384. // _push.unbindAccount(
  385. // account: f.SpUtil.getString(Constant.phone));
  386. NavigatorUtils.push(
  387. context, AccountRouter.loginPage,
  388. clearStack: true);
  389. },
  390. txt2: "取消",
  391. onPre2: () {
  392. NavigatorUtils.goBack(context);
  393. });
  394. },
  395. ),
  396. ),
  397. ))
  398. ]
  399. // ListView(padding: EdgeInsets.all(0.0), children: <Widget>[
  400. // ClickItem(title: "清理缓存", content: "0M"),
  401. // Padding(
  402. // padding: const EdgeInsets.all(16),
  403. // child: MyButton(
  404. // onPressed: (){
  405. // showAlert(context, "提示", "是否确定退出?", "确定", (){
  406. // User().clearUser();
  407. // _push.unbindAccount(account: f.SpUtil.getString(Constant.phone));
  408. // NavigatorUtils.push(context, AccountRouter.loginPage, clearStack: true);
  409. // },txt2: "取消",onPre2: (){
  410. // NavigatorUtils.goBack(context);
  411. // });
  412. // },
  413. // text: "退出当前账号",
  414. // ),
  415. // )
  416. // ])
  417. ));
  418. }
  419. bool hasNewVersion(version, newversion) {
  420. try {
  421. var currentVersionArr =
  422. version.version.split('.').map((e) => int.parse(e)).toList();
  423. var newVersionArr =
  424. newversion.split('.').map((e) => int.parse(e)).toList();
  425. if (currentVersionArr[0] < newVersionArr[0]) {
  426. return true;
  427. }
  428. if (currentVersionArr[1] < newVersionArr[1]) {
  429. return true;
  430. }
  431. if (currentVersionArr[2] < newVersionArr[2]) {
  432. return true;
  433. }
  434. } catch (e) {
  435. return false;
  436. }
  437. return false;
  438. }
  439. }