基础库
 
 
 
 
 

369 líneas
12 KiB

  1. import 'package:cached_network_image/cached_network_image.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_bloc/flutter_bloc.dart';
  4. import 'package:fluttertoast/fluttertoast.dart';
  5. import 'package:provider/provider.dart';
  6. import 'package:zhiying_comm/pages/login_page/model/login_style_model.dart';
  7. import 'package:zhiying_comm/util/empty_util.dart';
  8. import 'package:zhiying_comm/util/mob_util/mob_util.dart';
  9. import 'package:zhiying_comm/zhiying_comm.dart';
  10. import 'bloc/bloc.dart';
  11. import 'bloc/login_invite_repository.dart';
  12. import 'model/login_invite_user.dart';
  13. ///
  14. /// 邀请页面
  15. ///
  16. class LoginInvitePage extends StatelessWidget {
  17. final Map<String, dynamic> data;
  18. LoginInvitePage(this.data);
  19. @override
  20. Widget build(BuildContext context) {
  21. return Scaffold(
  22. resizeToAvoidBottomInset: false,
  23. backgroundColor: HexColor.fromHex('#FFFFFF'),
  24. body: BlocProvider(
  25. create: (_) => LoginInviteBloc(repostitory: LoginInviteRepository(data))..add(LoginInviteInitEvent()),
  26. child: LoginInvitePageContainer(this.data),
  27. ),
  28. );
  29. }
  30. }
  31. ///
  32. /// 邀请
  33. class LoginInvitePageContainer extends StatefulWidget {
  34. final Map<String, dynamic> data;
  35. LoginInvitePageContainer(this.data);
  36. @override
  37. _LoginInvitePageContainerState createState() => _LoginInvitePageContainerState();
  38. }
  39. class _LoginInvitePageContainerState extends State<LoginInvitePageContainer> {
  40. TextEditingController _editingController;
  41. FocusNode _focusNode;
  42. bool _showInviteInfo = false;
  43. // 是否登录中
  44. bool _isLogging = false;
  45. /// 返回上一页
  46. void _openPop() {
  47. if (Navigator.canPop(context)) {
  48. Navigator.pop(context);
  49. }
  50. }
  51. /// 注册成功跳转
  52. void _successJump() {
  53. RouterUtil.hideKeyboard(context);
  54. RouterUtil.goBackHomePage(context);
  55. // Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => PageFactory.create('homePage', null)), (Route<dynamic> route) => false,);
  56. }
  57. /// 输入框输入变化
  58. void _onChange(String string) {
  59. setState(() {
  60. _showInviteInfo = false;
  61. });
  62. print('$string');
  63. if (!EmptyUtil.isEmpty(string) && string.length >= 3) {
  64. _queryInviteInfo(string);
  65. }
  66. }
  67. /// 查询邀请人
  68. void _queryInviteInfo(String inviteNum) {
  69. if (!EmptyUtil.isEmpty(inviteNum) && inviteNum.length < 3) {
  70. return;
  71. }
  72. BlocProvider.of<LoginInviteBloc>(context).add(LoginInviteQueryEvent(num: inviteNum));
  73. }
  74. /// 填写邀请啊吗
  75. void _submitOnClick(LoginInviteUser inviteUser) async {
  76. _focusNode.unfocus();
  77. if (!_isLogging) {
  78. /// 邀请码
  79. String inviteNum = inviteUser?.userId ?? '';
  80. /// 手机号
  81. // UserInfoModel model = await Provider.of<UserInfoNotifier>(context, listen: false)?.getUserInfoModel();
  82. String mobile = widget?.data['mobile'] ;//model?.mobile ?? '';
  83. if (!EmptyUtil.isEmpty(inviteNum) && !EmptyUtil.isEmpty(mobile)) {
  84. setState(() {
  85. _isLogging = true;
  86. });
  87. BlocProvider.of<LoginInviteBloc>(context).add(LoginInviteSubmitEvent(mobile: mobile, num: inviteNum));
  88. }
  89. }
  90. }
  91. @override
  92. void initState() {
  93. _editingController = TextEditingController();
  94. // SharedPreferencesUtil.setNetCacheResult(Constants.mobInvitedCode, tgid);
  95. MobUtil.getInvitedCode().then((value) {
  96. print("获取到的邀请码"+(value??""));
  97. _editingController.text = value;
  98. _onChange(value);
  99. });
  100. _focusNode = FocusNode();
  101. super.initState();
  102. }
  103. @override
  104. void didChangeDependencies() {
  105. super.didChangeDependencies();
  106. }
  107. @override
  108. void dispose() {
  109. _editingController?.dispose();
  110. _focusNode?.unfocus();
  111. _focusNode?.dispose();
  112. super.dispose();
  113. }
  114. @override
  115. Widget build(BuildContext context) {
  116. return BlocConsumer<LoginInviteBloc, LoginInviteState>(
  117. listener: (context, state) {},
  118. buildWhen: (previous, current) {
  119. /// 提交失败
  120. if (current is LoginInviteSubmitErrorState) {
  121. _isLogging = false;
  122. return false;
  123. }
  124. /// 数据加载出错
  125. if (current is LoginInviteErrorState) {
  126. return false;
  127. }
  128. /// 查询邀请人失败
  129. if (current is LoginInviteQueryErrorState) {
  130. return false;
  131. }
  132. /// 邀请人查询成功
  133. if (current is LoginInviteQuerySuccessState) {
  134. _showInviteInfo = true;
  135. return true;
  136. }
  137. /// 邀请码成功 跳转
  138. if (current is LoginInviteSubmitSuccess) {
  139. // 缓存数据
  140. Provider.of<UserInfoNotifier>(context, listen: false).setUserInfo(current.model);
  141. _successJump();
  142. return false;
  143. }
  144. return true;
  145. },
  146. builder: (context, state) {
  147. print(state);
  148. if (state is LoginInviteLoadedState) {
  149. return _getMainWidget(state.model, null);
  150. }
  151. if (state is LoginInviteQuerySuccessState) {
  152. return _getMainWidget(state.pageMdel, state.model);
  153. }
  154. /// 骨架屏
  155. return Container();
  156. },
  157. );
  158. }
  159. /// 主视图
  160. Widget _getMainWidget(LoginStyleModel model, LoginInviteUser inviteUser) {
  161. return Column(
  162. children: <Widget>[
  163. /// appbar
  164. _getAppBar(model),
  165. /// 标题
  166. Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 40), child: _getTitleWidget(model)),
  167. /// 输入框
  168. Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 30), child: _getInviteInputWidget(model)),
  169. /// 邀请人信息
  170. Visibility(visible: inviteUser != null && _showInviteInfo, child: Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 8), child: _getInviteInfoWidget(inviteUser))),
  171. /// 按钮
  172. Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 30), child: _getSubmiBtnWidget(model, inviteUser)),
  173. ],
  174. );
  175. }
  176. /// appBar
  177. Widget _getAppBar(LoginStyleModel model) {
  178. return AppBar(
  179. brightness: Brightness.light,
  180. backgroundColor: HexColor.fromHex('#FFFFFF'),
  181. elevation: 0,
  182. title: Text(
  183. model?.invite?.appBarTitle ?? '登录',
  184. style: TextStyle(color: HexColor.fromHex(model?.invite?.appBarTitleColor ?? '#333333')),
  185. ),
  186. centerTitle: true,
  187. leading: IconButton(
  188. icon: Icon(
  189. Icons.arrow_back_ios,
  190. size: 22,
  191. color: HexColor.fromHex('#333333'),
  192. ),
  193. onPressed: () => _openPop(),
  194. ),
  195. );
  196. }
  197. /// title
  198. Widget _getTitleWidget(LoginStyleModel model) {
  199. return Align(
  200. alignment: Alignment.centerLeft,
  201. child: Text(
  202. model?.invite?.title ?? '输入邀请码',
  203. style: TextStyle(color: HexColor.fromHex(model?.invite?.titleColor ?? '#333333'), fontSize: 25),
  204. ));
  205. }
  206. /// 邀请码输入框
  207. Widget _getInviteInputWidget(LoginStyleModel model) {
  208. return _getCustomInputWidget(
  209. hint: model?.invite?.inputInviteText ?? '请输入邀请码',
  210. controller: _editingController,
  211. focusNode: _focusNode,
  212. onChanged: _onChange,
  213. hintColor: model?.invite?.inputHintColor ?? '#999999',
  214. bgColor: model?.invite?.inputBgColor ?? '#F7F7F7',
  215. textColor: model?.invite?.inputInviteTextColor ?? '#333333',
  216. iconUrl: model?.invite?.inputInviteIcon ?? '');
  217. }
  218. /// 邀请人信息
  219. Widget _getInviteInfoWidget(LoginInviteUser model) {
  220. return Container(
  221. // height: 77.5,
  222. decoration: BoxDecoration(borderRadius: BorderRadius.circular(8), border: Border.all(color: HexColor.fromHex('#E8E8E8'), width: 0.5)),
  223. padding: const EdgeInsets.all(15),
  224. child: Row(
  225. children: <Widget>[
  226. /// 头像
  227. CircleAvatar(
  228. radius: 23.5,
  229. backgroundImage: CachedNetworkImageProvider(model?.avatar ?? ''),
  230. ),
  231. const SizedBox(width: 13),
  232. Column(
  233. mainAxisAlignment: MainAxisAlignment.spaceAround,
  234. crossAxisAlignment: CrossAxisAlignment.start,
  235. children: <Widget>[
  236. /// 名字
  237. Text(
  238. '${model?.nickname}',
  239. style: TextStyle(color: HexColor.fromHex(model?.nickNameColor), fontSize: 13),
  240. ),
  241. /// 邀请
  242. RichText(
  243. text: TextSpan(text: '邀请您进入', style: TextStyle(fontSize: 11, color: HexColor.fromHex(model?.nickNameColor)), children: [
  244. TextSpan(
  245. text: '${model?.appName}',
  246. style: TextStyle(fontSize: 11, color: HexColor.fromHex(model?.appNameColor)),
  247. ),
  248. ]),
  249. )
  250. ],
  251. )
  252. ],
  253. ),
  254. );
  255. }
  256. /// 按钮
  257. Widget _getSubmiBtnWidget(LoginStyleModel model, LoginInviteUser inviteUser) {
  258. return Material(
  259. child: Container(
  260. height: 52,
  261. width: double.infinity,
  262. color: Colors.white,
  263. child: RaisedButton(
  264. child: Text(
  265. _isLogging ? '进入...' : model?.invite?.btnSubmitText ?? '进入智莺生活',
  266. style: TextStyle(fontSize: 15),
  267. ),
  268. textColor: HexColor.fromHex(model?.invite?.btnSubmitTextColor ?? '#FFFFFF'),
  269. color: HexColor.fromHex(model?.invite?.btnSubmitBgColor ?? '#FF3939'),
  270. disabledColor: HexColor.fromHex(model?.invite?.btnBanBgColor ?? '#F5F5F5'),
  271. disabledTextColor: HexColor.fromHex(model?.invite?.btnBanTextColor ?? '#999999'),
  272. elevation: 5,
  273. shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(52 / 2)),
  274. onPressed: _showInviteInfo && inviteUser != null ? () => _submitOnClick(inviteUser) : null,
  275. ),
  276. ),
  277. );
  278. }
  279. /// 自定义输入框
  280. Widget _getCustomInputWidget(
  281. {String hint, String hintColor, String bgColor, String textColor, String iconUrl, TextEditingController controller, ValueChanged<String> onChanged, FocusNode focusNode}) {
  282. var border = OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: HexColor.fromHex(bgColor), width: 0));
  283. return Container(
  284. height: 42,
  285. padding: const EdgeInsets.symmetric(horizontal: 15),
  286. decoration: BoxDecoration(
  287. color: HexColor.fromHex(bgColor),
  288. borderRadius: BorderRadius.circular(8),
  289. ),
  290. child: Row(
  291. mainAxisAlignment: MainAxisAlignment.start,
  292. crossAxisAlignment: CrossAxisAlignment.center,
  293. children: <Widget>[
  294. CachedNetworkImage(
  295. imageUrl: iconUrl ?? '',
  296. width: 10,
  297. ),
  298. Expanded(
  299. child: TextField(
  300. controller: controller,
  301. focusNode: focusNode,
  302. onChanged: onChanged,
  303. expands: false,
  304. style: TextStyle(color: HexColor.fromHex(textColor)),
  305. maxLines: 1,
  306. keyboardType: TextInputType.text,
  307. decoration: InputDecoration(
  308. contentPadding: EdgeInsets.only(top: 30, left: 7.5),
  309. hintText: hint,
  310. hintStyle: TextStyle(fontSize: 13, color: HexColor.fromHex(hintColor)),
  311. hintMaxLines: 1,
  312. filled: true,
  313. fillColor: Colors.transparent,
  314. border: border,
  315. focusedBorder: border,
  316. enabledBorder: border,
  317. disabledBorder: border,
  318. errorBorder: border,
  319. focusedErrorBorder: border,
  320. ),
  321. ),
  322. ),
  323. ],
  324. ),
  325. );
  326. }
  327. }