setting_page.dart 16 KB

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