base_info_step1.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. import 'dart:html';
  2. import 'dart:typed_data';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter_svg/svg.dart';
  5. import 'package:get/get.dart';
  6. import 'package:link/utils/storage.dart';
  7. import 'package:link/view/component/link_btn.dart';
  8. import 'package:file_picker/file_picker.dart';
  9. import 'package:link/view/component/link_step.dart';
  10. import 'package:link/view/component/toast.dart';
  11. import '../constants.dart';
  12. import '../utils/api.dart';
  13. import '../utils/http_utils.dart';
  14. import '../utils/size_fit.dart';
  15. import 'component/top_container.dart';
  16. import 'package:dio/dio.dart' as adio;
  17. import 'package:dio/dio.dart';
  18. import 'component/upload_file.dart';
  19. import 'edit_avatar.dart';
  20. class EditAvatrNick extends StatefulWidget {
  21. const EditAvatrNick({Key? key}) : super(key: key);
  22. @override
  23. State<EditAvatrNick> createState() => _EditAvatrNickState();
  24. }
  25. class _EditAvatrNickState extends State<EditAvatrNick> {
  26. TextEditingController controller = TextEditingController();
  27. FocusNode focusNode = FocusNode();
  28. bool isFocus = false;
  29. String strContent = '';
  30. String avatar = '';
  31. Uint8List? chooseImage;
  32. @override
  33. void initState() {
  34. // TODO: implement initState
  35. // var userInfo = StorageUtil().getJSON('userInfo');
  36. var userInfo = StorageUtil().getJSON('tempUser0');
  37. if (userInfo != null) {
  38. if (userInfo['nickname'] != null) {
  39. strContent = userInfo['nickname'];
  40. controller.text = strContent;
  41. }
  42. if (userInfo['avatar'] != null) {
  43. avatar = userInfo['avatar'];
  44. }
  45. } else {
  46. StorageUtil().setJSON('tempUser0', {});
  47. }
  48. focusNode.addListener(() {
  49. setState(() {
  50. isFocus = focusNode.hasFocus;
  51. });
  52. });
  53. super.initState();
  54. }
  55. updateCache() {
  56. StorageUtil()
  57. .setJSON('tempUser0', {"avatar": avatar, "nickname": strContent});
  58. }
  59. Future uploadImage(Uint8List? imgData) async {
  60. // Toast().showHud(context: context);
  61. Map<String, dynamic> data = await HttpUtils.get(Api.ossFormUpload,
  62. params: {'type': 'AVATAR', 'file_ext': 'png'});
  63. Dio dio = Dio();
  64. Map<String, dynamic> map = data['fields'];
  65. map['file'] =
  66. await adio.MultipartFile.fromBytes(imgData!, filename: 'avatar.png');
  67. adio.FormData formData = adio.FormData.fromMap(map);
  68. adio.Response response = await dio.post(data['upload_url'], data: formData);
  69. var data2 =
  70. await HttpUtils.post(Api.userInfo, data: {'avatar': data['view_url']});
  71. if (data2 != null) {
  72. print(data['view_url']);
  73. // getUserInfo();
  74. }
  75. setState(() {
  76. avatar = data['view_url'];
  77. });
  78. updateCache();
  79. // Toast().hideHud();
  80. }
  81. Future commit() async {
  82. if (chooseImage == null && avatar.isEmpty) {
  83. Toast().showInfoText('请上传头像', context: context);
  84. return;
  85. }
  86. if (strContent.isEmpty) {
  87. Toast().showInfoText('请输入昵称', context: context);
  88. return;
  89. }
  90. Toast().showHud(context: context);
  91. var data2 =
  92. await HttpUtils.post(Api.userInfo, data: {'nickname': strContent});
  93. if (data2 != null) {
  94. print(data2.toString());
  95. }
  96. Toast().hideHud();
  97. Get.toNamed('/edit_base_info');
  98. StorageUtil().remove('tempUser0');
  99. }
  100. body() {
  101. return Material(
  102. color: kBgColor,
  103. child: TopContainer(
  104. child: Stack(children: [
  105. Column(
  106. children: [
  107. SizedBox(
  108. height: 32.px,
  109. ),
  110. Row(
  111. mainAxisAlignment: MainAxisAlignment.center,
  112. children: [
  113. LinkStep(step: 1, content: '完善基本信息', hasShadow: true),
  114. Container(
  115. width: 60.px,
  116. height: 8.px,
  117. transform: Matrix4.translationValues(-1, 0, 0),
  118. decoration: const BoxDecoration(
  119. gradient: LinearGradient(
  120. begin: Alignment.centerLeft,
  121. end: Alignment.centerRight,
  122. colors: [kThemeColor, Color(0xFF74747A)])),
  123. ),
  124. Container(
  125. transform: Matrix4.translationValues(-2, 0, 0),
  126. child: LinkStep(step: 2, content: '', hasShadow: false),
  127. )
  128. ],
  129. ),
  130. SizedBox(
  131. height: 64.px,
  132. ),
  133. UploadFile(
  134. child: ClipRRect(
  135. borderRadius: BorderRadius.circular(70.px),
  136. child: Container(
  137. width: 140.px,
  138. height: 140.px,
  139. alignment: Alignment.bottomCenter,
  140. decoration: BoxDecoration(
  141. image: chooseImage != null
  142. ? DecorationImage(
  143. image: MemoryImage(chooseImage!),
  144. fit: BoxFit.cover)
  145. : avatar.isNotEmpty
  146. ? DecorationImage(
  147. image: NetworkImage(avatar),
  148. fit: BoxFit.cover)
  149. : const DecorationImage(
  150. image: AssetImage(
  151. 'assets/images/default_avatar.png'))),
  152. child: Container(
  153. height: 28.px,
  154. color: kThemeColor,
  155. alignment: Alignment.center,
  156. child: SvgPicture.asset(
  157. 'assets/icons/edit.svg',
  158. width: 24.px,
  159. height: 24.px,
  160. color: Colors.black,
  161. ),
  162. ),
  163. )),
  164. callback: (Uint8List file) {
  165. showDialog(
  166. context: context,
  167. barrierDismissible: false,
  168. barrierColor: Colors.transparent,
  169. useSafeArea: false,
  170. builder: (BuildContext context) {
  171. return EditAvatar(
  172. image: file,
  173. callback: (Uint8List img) {
  174. setState(() {
  175. chooseImage = img;
  176. });
  177. uploadImage(img);
  178. },
  179. );
  180. });
  181. // setState(() {
  182. // chooseImage = file;
  183. // });
  184. // uploadImage(file);
  185. },
  186. ),
  187. // GestureDetector(
  188. // onTap: () {
  189. // chooseFile();
  190. // },
  191. // child: ClipRRect(
  192. // borderRadius: BorderRadius.circular(70.px),
  193. // child: Container(
  194. // width: 140.px,
  195. // height: 140.px,
  196. // alignment: Alignment.bottomCenter,
  197. // decoration: BoxDecoration(
  198. // image: chooseImage != null
  199. // ? DecorationImage(
  200. // image: MemoryImage(chooseImage!),
  201. // fit: BoxFit.cover)
  202. // : avatar.isNotEmpty
  203. // ? DecorationImage(
  204. // image: NetworkImage(avatar),
  205. // fit: BoxFit.cover)
  206. // : const DecorationImage(
  207. // image: AssetImage(
  208. // 'assets/images/default_avatar.png'))),
  209. // child: Container(
  210. // height: 28.px,
  211. // color: kThemeColor,
  212. // alignment: Alignment.center,
  213. // child: SvgPicture.asset(
  214. // 'assets/icons/edit.svg',
  215. // width: 13.px,
  216. // height: 13.px,
  217. // color: Colors.black,
  218. // ),
  219. // ),
  220. // )),
  221. // ),
  222. SizedBox(
  223. height: 24.px,
  224. ),
  225. Container(
  226. width: 315.px,
  227. height: 68.px,
  228. alignment: Alignment.centerLeft,
  229. padding: EdgeInsets.only(left: 16.px, right: 16.px),
  230. decoration: BoxDecoration(
  231. borderRadius: BorderRadius.circular(16.px),
  232. color: const Color(0xFF2C2C2E)),
  233. child: TextField(
  234. // autofocus: true,
  235. controller: controller,
  236. focusNode: focusNode,
  237. maxLength: 50,
  238. cursorColor: kBtnColor,
  239. onChanged: (value) {
  240. setState(() {
  241. strContent = value;
  242. });
  243. updateCache();
  244. },
  245. textAlign: TextAlign.center,
  246. style: TextStyle(color: Colors.white, fontSize: 18.px),
  247. decoration: InputDecoration(
  248. border: InputBorder.none,
  249. hintText: isFocus ? '' : '请输入您的昵称',
  250. hintStyle: TextStyle(
  251. fontSize: 18.px, color: const Color(0xFF74747A)),
  252. counterText: "",
  253. ),
  254. )),
  255. Expanded(child: Container()),
  256. LinkButton(
  257. title: '下一步',
  258. disable: false,
  259. isBlack: false,
  260. callback: () {
  261. commit();
  262. // Get.toNamed('/edit_base_info');
  263. }),
  264. SizedBox(
  265. height: 56.px,
  266. )
  267. ],
  268. ),
  269. ])));
  270. }
  271. @override
  272. Widget build(BuildContext context) {
  273. SizeFit.initialize(context);
  274. return body();
  275. // return Padding(padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),child: body(),);
  276. // return Scaffold(resizeToAvoidBottomInset: true,body: body(),);
  277. }
  278. }