user.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. import 'package:flutter/material.dart';
  2. import 'package:bot_toast/bot_toast.dart';
  3. import 'package:cached_network_image/cached_network_image.dart';
  4. import 'package:provider/provider.dart';
  5. import 'package:twong/api/index.dart';
  6. import 'package:twong/pages/tabs.dart';
  7. import 'package:twong/providers/message.dart';
  8. import 'package:twong/providers/order_num.dart';
  9. import 'package:twong/providers/user.dart';
  10. import 'package:twong/utils/index.dart';
  11. import 'package:twong/config/style.dart';
  12. import 'package:twong/router/index.dart';
  13. import 'package:twong/utils/image_utils.dart';
  14. import 'package:twong/widgets/fsuper.dart';
  15. class UserPage extends StatefulWidget {
  16. @override
  17. State<StatefulWidget> createState() {
  18. return _UserPageState();
  19. }
  20. }
  21. class _UserPageState extends State<UserPage> {
  22. @override
  23. void initState() {
  24. super.initState();
  25. loadData();
  26. }
  27. void loadData() async {
  28. Network.inst.getUserInfo().then((res){
  29. // setState(() {});
  30. }).catchError((err, stack) {
  31. Log.e(err.toString() + stack.toString());
  32. BotToast.showText(text: err.toString());
  33. });
  34. // Network.inst.getOrderData().then((res) {
  35. // // Provider.of<OrderNumModel>(context, listen: false).update(res);
  36. // }).catchError((err, stack) {
  37. // Log.e(err.toString() + stack.toString());
  38. // });
  39. }
  40. Widget _buildHeader() {
  41. if (Cache.user == null) return Container(height: 124.px,
  42. color: DColors.Main, child: Center(child: Utils.loadingWidget));
  43. return Container(
  44. color: DColors.Main,
  45. padding: EdgeInsets.only(left: 12.px, right: 12.px),
  46. child: Column(
  47. children: [
  48. Container(height: 32.px, child: Row(
  49. children: [
  50. Spacer(),
  51. IconButton(icon: Icon(Icons.settings, color: Colors.white),
  52. highlightColor: Colors.transparent,
  53. onPressed: () async {
  54. await Navigator.pushNamed(context, RouteNames.setting);
  55. if (Cache.user == null && TabsState.inst != null) {
  56. TabsState.inst.doItemTap(0);
  57. }
  58. }),
  59. Consumer<MessageModel>(
  60. builder: (context, model, child) =>
  61. FSuper(
  62. child1: Icon(IconFonts.message, color: Colors.white),
  63. padding: EdgeInsets.only(left: 12.px, right: 12.px),
  64. onClick: () =>
  65. Navigator.pushNamed(context, RouteNames.message),
  66. redPoint: model.data != null && model.data.length > 0,
  67. redPointText: model.data == null ? "" : model.data
  68. .length.toString(),
  69. redPointColor: Colors.white,
  70. redPointTextStyle: TextStyle(color: Colors.red,
  71. fontSize: 10.px, fontWeight: FontWeight.bold),
  72. ),
  73. )
  74. ],
  75. )),
  76. Consumer<UserModel>(
  77. builder: (context, model, child) =>
  78. model.info == null ? Container()
  79. : Row(
  80. children: [
  81. InkWell(
  82. onTap: () {
  83. Navigator.pushNamed(context, RouteNames.account);
  84. },
  85. child: Container(
  86. margin: EdgeInsets.only(left: 12.px),
  87. child: CircleAvatar(
  88. radius: 34.px,
  89. backgroundImage: CachedNetworkImageProvider(
  90. model.info.avatar),
  91. )),
  92. ),
  93. Expanded(child: Container(
  94. margin: EdgeInsets.only(left: 22.px),
  95. child: Column(
  96. crossAxisAlignment: CrossAxisAlignment.start,
  97. children: [
  98. Text(model.info.nickname,
  99. style: TextStyle(color: Colors.white,
  100. fontSize: 16.px)),
  101. Text("我的ID: ${model.info.uid}",
  102. style: TextStyle(color: Colors.white,
  103. fontSize: 12.px))
  104. ],
  105. ),
  106. )),
  107. ],
  108. ),
  109. )
  110. ])
  111. );
  112. }
  113. Widget _buildOrder(dynamic data) {
  114. List<String> titles = ['待付款', '待发货', '待收货', '待评价'];
  115. List<IconData> icons = [
  116. Icons.credit_card,
  117. Icons.shop,
  118. Icons.assignment_returned,
  119. Icons.message_outlined
  120. ];
  121. List<String> dataKeys =
  122. ["unpaid_count", "unshipped_count", "received_count", "evaluated_count"];
  123. List<Widget> widgets = [];
  124. for (var i = 0; i < titles.length; i ++) {
  125. widgets.add(Expanded(child: FSuper(
  126. text: titles[i],
  127. padding: EdgeInsets.all(12.px),
  128. margin: EdgeInsets.only(top: 20.px),
  129. child1: Icon(icons[i]),
  130. child1Margin: EdgeInsets.only(bottom: 20.px),
  131. redPoint: data != null && data[dataKeys[i]] > 0,
  132. redPointText: data == null ? "" : data[dataKeys[i]].toString(),
  133. redPointOffset: Offset(-20.px, -6.px),
  134. onClick: () => Navigator.pushNamed(context, RouteNames.order, arguments: i),
  135. )));
  136. }
  137. widgets.add(Expanded(child: FSuper(
  138. text: "客服",
  139. padding: EdgeInsets.all(12.px),
  140. margin: EdgeInsets.only(top: 20.px),
  141. child1: Icon(Icons.phone),
  142. child1Margin: EdgeInsets.only(bottom: 20.px),
  143. onClick: () => Utils.notOpen(),
  144. )));
  145. return Container(
  146. decoration: BoxDecoration(
  147. color: Colors.white,
  148. borderRadius: BorderRadius.circular(6.px)
  149. ),
  150. child: Column(
  151. children: <Widget>[
  152. InkWell(
  153. onTap: () { Navigator.pushNamed(context, RouteNames.order, arguments: 0); },
  154. child: Container(
  155. padding: EdgeInsets.only(left: 16.px, right: 12.px, top: 12.px, bottom: 4.px),
  156. child: Row(children: [
  157. Expanded(
  158. child: Text("我的订单", style: TextStyle(fontSize: 14.px,
  159. fontWeight: FontWeight.bold))),
  160. Text("查看所有订单 ", style: TextStyle(color: Colors.grey)),
  161. Icon(Icons.keyboard_arrow_right, color: Colors.grey)
  162. ])),
  163. ),
  164. Divider(),
  165. Row(children: widgets)
  166. ],
  167. ),
  168. );
  169. }
  170. Widget _buildMenuList() {
  171. List<String> titles = ['收藏管理', '地址管理'];
  172. List<IconData> icons = [
  173. Icons.favorite,
  174. Icons.room,
  175. ];
  176. List<String> routers = [
  177. RouteNames.favours,
  178. RouteNames.address
  179. ];
  180. List<Widget> widgets = [];
  181. for (var idx = 0; idx < titles.length; idx++) {
  182. widgets.add(InkWell(
  183. highlightColor: Colors.transparent,
  184. onTap: () { Navigator.pushNamed(context, routers[idx]); },
  185. child: Container(
  186. height: 40.px,
  187. decoration: BoxDecoration(
  188. color: Colors.white,
  189. borderRadius: BorderRadius.circular(6.px)
  190. ),
  191. padding: EdgeInsets.only(left: 10.px, right: 10.px),
  192. margin: EdgeInsets.only(bottom: 8.px, left: 12.px, right: 12.px),
  193. child: Row(children: [
  194. Icon(icons[idx]),
  195. Container(width: 16.px),
  196. Expanded(child: Text(titles[idx])),
  197. Icon(Icons.keyboard_arrow_right, color: Colors.grey)
  198. ])
  199. ),
  200. ));
  201. }
  202. return Column(children: widgets);
  203. }
  204. @override
  205. Widget build(BuildContext context) {
  206. return Scaffold(
  207. backgroundColor: DColors.Main,
  208. body: SafeArea(
  209. child: Container(
  210. color: DColors.back,
  211. child: ListView(
  212. physics: NeverScrollableScrollPhysics(),
  213. children: <Widget>[
  214. _buildHeader(),
  215. Container(
  216. decoration: BoxDecoration(
  217. gradient: LinearGradient(
  218. begin: Alignment.topCenter,
  219. end: Alignment.bottomCenter,
  220. colors: [DColors.Main, DColors.back],
  221. ),
  222. ),
  223. padding: EdgeInsets.all(8.px),
  224. child: Consumer<OrderNumModel>(
  225. builder: (context, model, child) => _buildOrder(model.data),
  226. )
  227. ),
  228. _buildViper(),
  229. _buildMenuList(),
  230. ],
  231. ),
  232. ),
  233. ),
  234. );
  235. }
  236. Widget _buildViper() {
  237. if(!Cache.isVip) {
  238. return Container();
  239. }
  240. return Container(
  241. padding: EdgeInsets.only(top: 6.px, left: 10.px, right: 10.px, bottom: 8.px),
  242. child: Row(
  243. children: [
  244. Expanded(child: InkWell(
  245. onTap: () => Navigator.pushNamed(context, RouteNames.vipCenter),
  246. child: Container(
  247. height: 48.px,
  248. margin: EdgeInsets.only(right: 6.px),
  249. decoration: BoxDecoration(
  250. color: Colors.white,
  251. borderRadius: BorderRadius.circular(6.px)
  252. ),
  253. child: Row(
  254. children: [
  255. Container(
  256. margin: EdgeInsets.only(left: 12.px, right: 12.px),
  257. child: Icon(Icons.keyboard),
  258. ),
  259. Expanded(child: Column(
  260. mainAxisAlignment: MainAxisAlignment.center,
  261. crossAxisAlignment: CrossAxisAlignment.start,
  262. children: [
  263. Text("会员中心", style: TextStyle(color: Colors.black, fontSize: 13.px)),
  264. Text("点击查看您的会员权益", style: TextStyle(color: Colors.grey, fontSize: 10.px)),
  265. ],
  266. ))
  267. ],
  268. ),
  269. ),
  270. )),
  271. Expanded(child: InkWell(
  272. onTap: () => Navigator.pushNamed(context, RouteNames.promotion),
  273. child: Container(
  274. height: 48.px,
  275. margin: EdgeInsets.only(left: 6.px),
  276. decoration: BoxDecoration(
  277. color: Colors.white,
  278. borderRadius: BorderRadius.circular(6.px)
  279. ),
  280. child: Row(
  281. children: [
  282. Container(
  283. margin: EdgeInsets.only(left: 12.px, right: 12.px),
  284. child: Icon(Icons.keyboard),
  285. ),
  286. Expanded(child: Column(
  287. mainAxisAlignment: MainAxisAlignment.center,
  288. crossAxisAlignment: CrossAxisAlignment.start,
  289. children: [
  290. Text("推广中心", style: TextStyle(color: Colors.black, fontSize: 13.px)),
  291. Text("点击查看您的推广信息", style: TextStyle(color: Colors.grey, fontSize: 10.px)),
  292. ],
  293. ))
  294. ],
  295. ),
  296. ),
  297. )),
  298. ],
  299. ),
  300. );
  301. }
  302. }