MyInfoPage.dart 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_osc/constants/Constants.dart';
  3. import 'package:flutter_osc/events/LoginEvent.dart';
  4. import 'package:flutter_osc/events/LogoutEvent.dart';
  5. import '../pages/CommonWebPage.dart';
  6. import '../pages/LoginPage.dart';
  7. import 'dart:convert';
  8. import 'package:shared_preferences/shared_preferences.dart';
  9. import '../api/Api.dart';
  10. import '../util/NetUtils.dart';
  11. import '../util/DataUtils.dart';
  12. import '../model/UserInfo.dart';
  13. class MyInfoPage extends StatefulWidget {
  14. @override
  15. State<StatefulWidget> createState() {
  16. return MyInfoPageState();
  17. }
  18. }
  19. class MyInfoPageState extends State<MyInfoPage> {
  20. static const double IMAGE_ICON_WIDTH = 30.0;
  21. static const double ARROW_ICON_WIDTH = 16.0;
  22. var titles = ["我的消息", "阅读记录", "我的博客", "我的问答", "我的活动", "我的团队", "邀请好友"];
  23. var imagePaths = [
  24. "images/ic_my_message.png",
  25. "images/ic_my_blog.png",
  26. "images/ic_my_blog.png",
  27. "images/ic_my_question.png",
  28. "images/ic_discover_pos.png",
  29. "images/ic_my_team.png",
  30. "images/ic_my_recommend.png"
  31. ];
  32. var icons = [];
  33. var userAvatar;
  34. var userName;
  35. var titleTextStyle = TextStyle(fontSize: 16.0);
  36. var rightArrowIcon = Image.asset(
  37. 'images/ic_arrow_right.png',
  38. width: ARROW_ICON_WIDTH,
  39. height: ARROW_ICON_WIDTH,
  40. );
  41. MyInfoPageState() {
  42. for (int i = 0; i < imagePaths.length; i++) {
  43. icons.add(getIconImage(imagePaths[i]));
  44. }
  45. }
  46. @override
  47. void initState() {
  48. super.initState();
  49. _showUserInfo();
  50. Constants.eventBus.on(LogoutEvent).listen((event) {
  51. // 收到退出登录的消息,刷新个人信息显示
  52. _showUserInfo();
  53. });
  54. Constants.eventBus.on(LoginEvent).listen((event) {
  55. // 收到登录的消息,重新获取个人信息
  56. getUserInfo();
  57. });
  58. }
  59. _showUserInfo() {
  60. DataUtils.getUserInfo().then((UserInfo userInfo) {
  61. if (userInfo != null) {
  62. print(userInfo.name);
  63. print(userInfo.avatar);
  64. setState(() {
  65. userAvatar = userInfo.avatar;
  66. userName = userInfo.name;
  67. });
  68. } else {
  69. setState(() {
  70. userAvatar = null;
  71. userName = null;
  72. });
  73. }
  74. });
  75. }
  76. Widget getIconImage(path) {
  77. return Padding(
  78. padding: const EdgeInsets.fromLTRB(0.0, 0.0, 10.0, 0.0),
  79. child: Image.asset(path,
  80. width: IMAGE_ICON_WIDTH, height: IMAGE_ICON_WIDTH),
  81. );
  82. }
  83. @override
  84. Widget build(BuildContext context) {
  85. var listView = ListView.builder(
  86. itemCount: titles.length * 2,
  87. itemBuilder: (context, i) => renderRow(i),
  88. );
  89. return listView;
  90. }
  91. // 获取用户信息
  92. getUserInfo() async {
  93. SharedPreferences sp = await SharedPreferences.getInstance();
  94. String accessToken = sp.get(DataUtils.SP_AC_TOKEN);
  95. Map<String, String> params = Map();
  96. params['access_token'] = accessToken;
  97. NetUtils.get(Api.USER_INFO, params: params).then((data) {
  98. if (data != null) {
  99. var map = json.decode(data);
  100. setState(() {
  101. userAvatar = map['avatar'];
  102. userName = map['name'];
  103. });
  104. DataUtils.saveUserInfo(map);
  105. }
  106. });
  107. }
  108. _login() async {
  109. final result = await Navigator
  110. .of(context)
  111. .push(MaterialPageRoute(builder: (context) {
  112. return LoginPage();
  113. }));
  114. if (result != null && result == "refresh") {
  115. // 刷新用户信息
  116. getUserInfo();
  117. // 通知动弹页面刷新
  118. Constants.eventBus.fire(LoginEvent());
  119. }
  120. }
  121. _showUserInfoDetail() {}
  122. renderRow(i) {
  123. if (i == 0) {
  124. var avatarContainer = Container(
  125. color: const Color(0xff63ca6c),
  126. height: 200.0,
  127. child: Center(
  128. child: Column(
  129. mainAxisAlignment: MainAxisAlignment.center,
  130. children: [
  131. userAvatar == null
  132. ? Image.asset(
  133. "images/ic_avatar_default.png",
  134. width: 60.0,
  135. )
  136. : Container(
  137. width: 60.0,
  138. height: 60.0,
  139. decoration: BoxDecoration(
  140. shape: BoxShape.circle,
  141. color: Colors.transparent,
  142. image: DecorationImage(
  143. image: NetworkImage(userAvatar),
  144. fit: BoxFit.cover),
  145. border: Border.all(
  146. color: Colors.white,
  147. width: 2.0,
  148. ),
  149. ),
  150. ),
  151. Text(
  152. userName == null ? "点击头像登录" : userName,
  153. style: TextStyle(color: Colors.white, fontSize: 16.0),
  154. ),
  155. ],
  156. ),
  157. ),
  158. );
  159. return GestureDetector(
  160. onTap: () {
  161. DataUtils.isLogin().then((isLogin) {
  162. if (isLogin) {
  163. // 已登录,显示用户详细信息
  164. _showUserInfoDetail();
  165. } else {
  166. // 未登录,跳转到登录页面
  167. _login();
  168. }
  169. });
  170. },
  171. child: avatarContainer,
  172. );
  173. }
  174. --i;
  175. if (i.isOdd) {
  176. return Divider(
  177. height: 1.0,
  178. );
  179. }
  180. i = i ~/ 2;
  181. String title = titles[i];
  182. var listItemContent = Padding(
  183. padding: const EdgeInsets.fromLTRB(10.0, 15.0, 10.0, 15.0),
  184. child: Row(
  185. children: [
  186. icons[i],
  187. Expanded(
  188. child: Text(
  189. title,
  190. style: titleTextStyle,
  191. )),
  192. rightArrowIcon
  193. ],
  194. ),
  195. );
  196. return InkWell(
  197. child: listItemContent,
  198. onTap: () {
  199. _handleListItemClick(title);
  200. // Navigator
  201. // .of(context)
  202. // .push(MaterialPageRoute(builder: (context) => CommonWebPage(title: "Test", url: "https://my.oschina.net/u/815261/blog")));
  203. },
  204. );
  205. }
  206. _showLoginDialog() {
  207. showDialog(
  208. context: context,
  209. builder: (BuildContext ctx) {
  210. return AlertDialog(
  211. title: Text('提示'),
  212. content: Text('没有登录,现在去登录吗?'),
  213. actions: <Widget>[
  214. FlatButton(
  215. child: Text(
  216. '取消',
  217. style: TextStyle(color: Colors.red),
  218. ),
  219. onPressed: () {
  220. Navigator.of(context).pop();
  221. },
  222. ),
  223. FlatButton(
  224. child: Text(
  225. '确定',
  226. style: TextStyle(color: Colors.blue),
  227. ),
  228. onPressed: () {
  229. Navigator.of(context).pop();
  230. _login();
  231. },
  232. )
  233. ],
  234. );
  235. });
  236. }
  237. _handleListItemClick(String title) {
  238. DataUtils.isLogin().then((isLogin) {
  239. if (!isLogin) {
  240. // 未登录
  241. _showLoginDialog();
  242. } else {
  243. DataUtils.getUserInfo().then((info) {
  244. Navigator.of(context).push(
  245. MaterialPageRoute(
  246. builder: (context) => CommonWebPage(
  247. title: "我的博客",
  248. url: "https://my.oschina.net/u/${info.id}/blog"
  249. )
  250. ));
  251. });
  252. }
  253. });
  254. }
  255. }