import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:zhiying_comm/pages/login_page/model/login_style_model.dart'; import 'package:zhiying_comm/util/empty_util.dart'; import 'package:zhiying_comm/util/mob_util/mob_util.dart'; import 'package:zhiying_comm/zhiying_comm.dart'; import 'bloc/bloc.dart'; import 'bloc/login_invite_repository.dart'; import 'model/login_invite_user.dart'; /// /// 邀请页面 /// class LoginInvitePage extends StatelessWidget { final Map<String, dynamic> data; LoginInvitePage(this.data); @override Widget build(BuildContext context) { return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: HexColor.fromHex('#FFFFFF'), body: BlocProvider( create: (_) => LoginInviteBloc(repostitory: LoginInviteRepository(data))..add(LoginInviteInitEvent()), child: LoginInvitePageContainer(this.data), ), ); } } /// /// 邀请 class LoginInvitePageContainer extends StatefulWidget { final Map<String, dynamic> data; LoginInvitePageContainer(this.data); @override _LoginInvitePageContainerState createState() => _LoginInvitePageContainerState(); } class _LoginInvitePageContainerState extends State<LoginInvitePageContainer> { TextEditingController _editingController; FocusNode _focusNode; bool _showInviteInfo = false; // 是否登录中 bool _isLogging = false; /// 返回上一页 void _openPop() { if (Navigator.canPop(context)) { Navigator.pop(context); } } /// 注册成功跳转 void _successJump() { RouterUtil.hideKeyboard(context); RouterUtil.goBackHomePage(context); // Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (BuildContext context) => PageFactory.create('homePage', null)), (Route<dynamic> route) => false,); } /// 输入框输入变化 void _onChange(String string) { setState(() { _showInviteInfo = false; }); print('$string'); if (!EmptyUtil.isEmpty(string) && string.length >= 3) { _queryInviteInfo(string); } } /// 查询邀请人 void _queryInviteInfo(String inviteNum) { if (!EmptyUtil.isEmpty(inviteNum) && inviteNum.length < 3) { return; } BlocProvider.of<LoginInviteBloc>(context).add(LoginInviteQueryEvent(num: inviteNum)); } /// 填写邀请啊吗 void _submitOnClick(LoginInviteUser inviteUser) async { _focusNode.unfocus(); if (!_isLogging) { /// 邀请码 String inviteNum = inviteUser?.userId ?? ''; /// 手机号 // UserInfoModel model = await Provider.of<UserInfoNotifier>(context, listen: false)?.getUserInfoModel(); String mobile = widget?.data['mobile'] ;//model?.mobile ?? ''; if (!EmptyUtil.isEmpty(inviteNum) && !EmptyUtil.isEmpty(mobile)) { setState(() { _isLogging = true; }); BlocProvider.of<LoginInviteBloc>(context).add(LoginInviteSubmitEvent(mobile: mobile, num: inviteNum)); } } } @override void initState() { _editingController = TextEditingController(); // SharedPreferencesUtil.setNetCacheResult(Constants.mobInvitedCode, tgid); MobUtil.getInvitedCode().then((value) { print("获取到的邀请码"+(value??"")); _editingController.text = value; _onChange(value); }); _focusNode = FocusNode(); super.initState(); } @override void didChangeDependencies() { super.didChangeDependencies(); } @override void dispose() { _editingController?.dispose(); _focusNode?.unfocus(); _focusNode?.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return BlocConsumer<LoginInviteBloc, LoginInviteState>( listener: (context, state) {}, buildWhen: (previous, current) { /// 提交失败 if (current is LoginInviteSubmitErrorState) { _isLogging = false; return false; } /// 数据加载出错 if (current is LoginInviteErrorState) { return false; } /// 查询邀请人失败 if (current is LoginInviteQueryErrorState) { return false; } /// 邀请人查询成功 if (current is LoginInviteQuerySuccessState) { _showInviteInfo = true; return true; } /// 邀请码成功 跳转 if (current is LoginInviteSubmitSuccess) { // 缓存数据 Provider.of<UserInfoNotifier>(context, listen: false).setUserInfo(current.model); _successJump(); return false; } return true; }, builder: (context, state) { print(state); if (state is LoginInviteLoadedState) { return _getMainWidget(state.model, null); } if (state is LoginInviteQuerySuccessState) { return _getMainWidget(state.pageMdel, state.model); } /// 骨架屏 return Container(); }, ); } /// 主视图 Widget _getMainWidget(LoginStyleModel model, LoginInviteUser inviteUser) { return Column( children: <Widget>[ /// appbar _getAppBar(model), /// 标题 Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 40), child: _getTitleWidget(model)), /// 输入框 Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 30), child: _getInviteInputWidget(model)), /// 邀请人信息 Visibility(visible: inviteUser != null && _showInviteInfo, child: Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 8), child: _getInviteInfoWidget(inviteUser))), /// 按钮 Padding(padding: const EdgeInsets.only(left: 27.5, right: 27.5, top: 30), child: _getSubmiBtnWidget(model, inviteUser)), ], ); } /// appBar Widget _getAppBar(LoginStyleModel model) { return AppBar( brightness: Brightness.light, backgroundColor: HexColor.fromHex('#FFFFFF'), elevation: 0, title: Text( model?.invite?.appBarTitle ?? '登录', style: TextStyle(color: HexColor.fromHex(model?.invite?.appBarTitleColor ?? '#333333')), ), centerTitle: true, leading: IconButton( icon: Icon( Icons.arrow_back_ios, size: 22, color: HexColor.fromHex('#333333'), ), onPressed: () => _openPop(), ), ); } /// title Widget _getTitleWidget(LoginStyleModel model) { return Align( alignment: Alignment.centerLeft, child: Text( model?.invite?.title ?? '输入邀请码', style: TextStyle(color: HexColor.fromHex(model?.invite?.titleColor ?? '#333333'), fontSize: 25), )); } /// 邀请码输入框 Widget _getInviteInputWidget(LoginStyleModel model) { return _getCustomInputWidget( hint: model?.invite?.inputInviteText ?? '请输入邀请码', controller: _editingController, focusNode: _focusNode, onChanged: _onChange, hintColor: model?.invite?.inputHintColor ?? '#999999', bgColor: model?.invite?.inputBgColor ?? '#F7F7F7', textColor: model?.invite?.inputInviteTextColor ?? '#333333', iconUrl: model?.invite?.inputInviteIcon ?? ''); } /// 邀请人信息 Widget _getInviteInfoWidget(LoginInviteUser model) { return Container( // height: 77.5, decoration: BoxDecoration(borderRadius: BorderRadius.circular(8), border: Border.all(color: HexColor.fromHex('#E8E8E8'), width: 0.5)), padding: const EdgeInsets.all(15), child: Row( children: <Widget>[ /// 头像 CircleAvatar( radius: 23.5, backgroundImage: CachedNetworkImageProvider(model?.avatar ?? ''), ), const SizedBox(width: 13), Column( mainAxisAlignment: MainAxisAlignment.spaceAround, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ /// 名字 Text( '${model?.nickname}', style: TextStyle(color: HexColor.fromHex(model?.nickNameColor), fontSize: 13), ), /// 邀请 RichText( text: TextSpan(text: '邀请您进入', style: TextStyle(fontSize: 11, color: HexColor.fromHex(model?.nickNameColor)), children: [ TextSpan( text: '${model?.appName}', style: TextStyle(fontSize: 11, color: HexColor.fromHex(model?.appNameColor)), ), ]), ) ], ) ], ), ); } /// 按钮 Widget _getSubmiBtnWidget(LoginStyleModel model, LoginInviteUser inviteUser) { return Material( child: Container( height: 52, width: double.infinity, color: Colors.white, child: RaisedButton( child: Text( _isLogging ? '进入...' : model?.invite?.btnSubmitText ?? '进入智莺生活', style: TextStyle(fontSize: 15), ), textColor: HexColor.fromHex(model?.invite?.btnSubmitTextColor ?? '#FFFFFF'), color: HexColor.fromHex(model?.invite?.btnSubmitBgColor ?? '#FF3939'), disabledColor: HexColor.fromHex(model?.invite?.btnBanBgColor ?? '#F5F5F5'), disabledTextColor: HexColor.fromHex(model?.invite?.btnBanTextColor ?? '#999999'), elevation: 5, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(52 / 2)), onPressed: _showInviteInfo && inviteUser != null ? () => _submitOnClick(inviteUser) : null, ), ), ); } /// 自定义输入框 Widget _getCustomInputWidget( {String hint, String hintColor, String bgColor, String textColor, String iconUrl, TextEditingController controller, ValueChanged<String> onChanged, FocusNode focusNode}) { var border = OutlineInputBorder(borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: HexColor.fromHex(bgColor), width: 0)); return Container( height: 42, padding: const EdgeInsets.symmetric(horizontal: 15), decoration: BoxDecoration( color: HexColor.fromHex(bgColor), borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ CachedNetworkImage( imageUrl: iconUrl ?? '', width: 10, ), Expanded( child: TextField( controller: controller, focusNode: focusNode, onChanged: onChanged, expands: false, style: TextStyle(color: HexColor.fromHex(textColor)), maxLines: 1, keyboardType: TextInputType.text, decoration: InputDecoration( contentPadding: EdgeInsets.only(top: 30, left: 7.5), hintText: hint, hintStyle: TextStyle(fontSize: 13, color: HexColor.fromHex(hintColor)), hintMaxLines: 1, filled: true, fillColor: Colors.transparent, border: border, focusedBorder: border, enabledBorder: border, disabledBorder: border, errorBorder: border, focusedErrorBorder: border, ), ), ), ], ), ); } }