ソースを参照

1、登陆模块的更新

tags/0.0.1
PH2 4年前
コミット
2d20f6f611
21個のファイルの変更500行の追加307行の削除
  1. +9
    -2
      example/lib/main.dart
  2. +5
    -10
      lib/pages/home_page/home_page.dart
  3. +8
    -5
      lib/pages/login_page/account/bloc/login_account_repository.dart
  4. +6
    -2
      lib/pages/login_page/account/bloc/login_account_state.dart
  5. +101
    -91
      lib/pages/login_page/account/login_account_page.dart
  6. +15
    -12
      lib/pages/login_page/bloc/login_repository.dart
  7. +4
    -4
      lib/pages/login_page/invite/bloc/login_invite_bloc.dart
  8. +19
    -11
      lib/pages/login_page/invite/bloc/login_invite_repository.dart
  9. +9
    -8
      lib/pages/login_page/invite/bloc/login_invite_state.dart
  10. +278
    -10
      lib/pages/login_page/invite/login_invite_page.dart
  11. +12
    -3
      lib/pages/login_page/invite/model/login_invite_user.dart
  12. +14
    -4
      lib/pages/login_page/login_page.dart
  13. +5
    -5
      lib/pages/login_page/login_util.dart
  14. +0
    -43
      lib/pages/login_page/model/login_user.dart
  15. +0
    -35
      lib/pages/login_page/notifier/user_info_notifier.dart
  16. +11
    -19
      lib/register.dart
  17. +1
    -3
      lib/widgets/home/home_banner/bloc/home_banner_repository.dart
  18. +1
    -1
      lib/widgets/home/home_goods/bloc/home_goods_header_bloc.dart
  19. +1
    -1
      lib/widgets/home/home_quick_entry/bloc/home_quick_entry_repository.dart
  20. +1
    -1
      lib/widgets/home/home_slide_banner/bloc/home_slide_banner_repository.dart
  21. +0
    -37
      lib/widgets/home_slide_banner/bloc/home_slide_banner_repository.dart

+ 9
- 2
example/lib/main.dart ファイルの表示

@@ -1,7 +1,9 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/home_page/home_page.dart';
import 'package:provider/provider.dart';
import 'package:zhiying_base_widget/register.dart';
import 'package:zhiying_comm/zhiying_comm.dart';

void main() {
FlutterError.onError = (FlutterErrorDetails details) {
@@ -40,8 +42,13 @@ class _MyAppState extends State<MyApp> {
ErrorWidget.builder = (FlutterErrorDetails errorDetails) {
return getErrorWidget(context, errorDetails);
};
return MaterialApp(
home: HomePage(),
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: UserInfoNotifier()),
],
child: MaterialApp(
home: HomePage(),
),
);
}
}

+ 5
- 10
lib/pages/home_page/home_page.dart ファイルの表示

@@ -1,9 +1,9 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:provider/provider.dart';
import 'package:zhiying_base_widget/pages/home_page/home_page_bloc.dart';
import 'package:zhiying_base_widget/pages/login_page/notifier/user_info_notifier.dart';
import 'package:zhiying_comm/zhiying_comm.dart';
import 'package:zhiying_comm/util/base_bloc.dart';

@@ -19,14 +19,9 @@ class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
print('home_page build');
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: UserInfoNotifier()),
],
child: BlocProvider<HomePageBloc>(
bloc: HomePageBloc(),
child: _HomePageContainer(),
),
return BlocProvider<HomePageBloc>(
bloc: HomePageBloc(),
child: _HomePageContainer(),
);
}
}


+ 8
- 5
lib/pages/login_page/account/bloc/login_account_repository.dart ファイルの表示

@@ -1,10 +1,10 @@
import 'package:zhiying_base_widget/pages/login_page/account/bloc/bloc.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_user.dart';
import 'package:zhiying_base_widget/pages/login_page/login_util.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_comm/util/empty_util.dart';
import 'package:zhiying_comm/util/global_config.dart';
import 'package:zhiying_comm/util/net_util.dart';
import 'package:zhiying_comm/models/user/user_info_model.dart';

///
/// 账户登陆
@@ -36,12 +36,15 @@ class LoginAccountRepository{
}

/// 验证码登陆
Future<LoginUser> loginTypeVcode(LoginAccountTypeVcodeEvent event) async{
Future<UserInfoModel> loginTypeVcode(LoginAccountTypeVcodeEvent event) async{
var result = await NetUtil.post('/api/v1/sign/fast/in', params: {'mobile': event.mobile, 'captcha': event.captcha});
if(NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])){
LoginUser loginUser = LoginUser.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);

return loginUser;
UserInfoModel loginUser = UserInfoModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
if(null != loginUser){
loginUser.mobile = event.mobile;
return loginUser;
}
return null;
}
return null;
}


+ 6
- 2
lib/pages/login_page/account/bloc/login_account_state.dart ファイルの表示

@@ -1,7 +1,7 @@
import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_user.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_comm/models/user/user_info_model.dart';

abstract class LoginAccountState extends Equatable {
const LoginAccountState();
@@ -29,7 +29,9 @@ class LoginAccountErrorState extends LoginAccountState {}
/// 验证码下发成功的状态
class LoginAccountGetVcodeSuccessState extends LoginAccountState {
final String msg;

const LoginAccountGetVcodeSuccessState({this.msg});

@override
List<Object> get props => [this.msg];
}
@@ -37,12 +39,13 @@ class LoginAccountGetVcodeSuccessState extends LoginAccountState {
/// 验证码下发失败的状态
class LoginAccountGetVcodeErrorState extends LoginAccountState {
final String msg;

const LoginAccountGetVcodeErrorState({this.msg});
}

/// 验证码登陆成功
class LoginAccountTypeVcodeLoginSuccessState extends LoginAccountState {
final LoginUser model;
final UserInfoModel model;

const LoginAccountTypeVcodeLoginSuccessState({@required this.model});

@@ -53,5 +56,6 @@ class LoginAccountTypeVcodeLoginSuccessState extends LoginAccountState {
/// 验证码登陆失败
class LoginAccountTypeVcodeLoginErrorState extends LoginAccountState {
final String msg;

const LoginAccountTypeVcodeLoginErrorState({this.msg});
}

+ 101
- 91
lib/pages/login_page/account/login_account_page.dart ファイルの表示

@@ -5,7 +5,6 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';
import 'package:zhiying_base_widget/pages/login_page/account/bloc/bloc.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_base_widget/pages/login_page/notifier/user_info_notifier.dart';
import 'package:zhiying_comm/zhiying_comm.dart';
import 'bloc/login_account_repository.dart';
import 'widget/slide_verify_widget.dart';
@@ -44,7 +43,6 @@ class LoginAccountPageContianer extends StatefulWidget {
/// 主体逻辑
///
class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> implements OnClickListener {

TextEditingController _phoneEdController;
TextEditingController _vcodeEdController;
TextEditingController _passEdController;
@@ -53,29 +51,37 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
FocusNode _vcodeFN;

/// 跳转到邀请码页面
void _openInvitePage(){
void _openInvitePage() {
print('跳转到邀请码页面');
Navigator.push(context, MaterialPageRoute(
builder: (_) => PageFactory.create('login_invite', null)
));
}

/// 登陆成功页面
void _openLoginSuccessPage(){
void _openLoginSuccessPage() {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (BuildContext context) => PageFactory.create('homePage', null)),
(Route<dynamic> route) => false,
(Route<dynamic> route) => false,
);
}

/// 返回上一页
void _openPop() {
if (Navigator.canPop(context)) {
Navigator.pop(context);
}
}

/// 登陆
void _submitOnClick() {
print('登陆');
if(_checkParam(true)) {
if (_checkParam(true)) {
if (_useVcode) {
BlocProvider.of<LoginAccountBloc>(context).add(
LoginAccountTypeVcodeEvent(mobile: _phoneEdController?.text?.toString()?.trim() ?? '', captcha: _vcodeEdController?.text?.toString()?.trim() ?? ''));
BlocProvider.of<LoginAccountBloc>(context).add(LoginAccountTypeVcodeEvent(mobile: _phoneEdController?.text?.toString()?.trim() ?? '', captcha: _vcodeEdController?.text?.toString()?.trim() ?? ''));
} else {
BlocProvider.of<LoginAccountBloc>(context).add(LoginAccountTypePasswordEvent(username: _phoneEdController?.text?.toString()?.trim() ?? '',
password: _passEdController?.text?.toString()?.trim() ?? ''));
BlocProvider.of<LoginAccountBloc>(context).add(LoginAccountTypePasswordEvent(username: _phoneEdController?.text?.toString()?.trim() ?? '', password: _passEdController?.text?.toString()?.trim() ?? ''));
}
}
}
@@ -88,10 +94,10 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
_useVcode = !_useVcode;
});
// 清除缓存
if(_useVcode){
if (_useVcode) {
_passEdController?.clear();
_passFN?.unfocus();
}else{
} else {
_vcodeEdController?.clear();
_vcodeFN?.unfocus();
}
@@ -107,63 +113,63 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
}

/// 打开协议
void _openAgreement(String url){
if(!EmptyUtil.isEmpty(url)){
void _openAgreement(String url) {
if (!EmptyUtil.isEmpty(url)) {
print('打开协议$url');
}
}

/// 输入框监听
void _onChange(string){
void _onChange(string) {
print('$string');
_checkParam(false);
}

/// 校验登陆参数
bool _checkParam(bool needToast){
bool _checkParam(bool needToast) {
// 验证码
if(_useVcode){
if (_useVcode) {
String phone = _phoneEdController?.text?.toString()?.trim() ?? null;
String vcode = _vcodeEdController?.text?.toString()?.trim() ?? null;
if(EmptyUtil.isEmpty(phone)){
if(needToast) Fluttertoast.showToast(msg: '手机号不能为空!');
if (EmptyUtil.isEmpty(phone)) {
if (needToast) Fluttertoast.showToast(msg: '手机号不能为空!');
return false;
}
if(phone.length != 11){
if(needToast) Fluttertoast.showToast(msg: '手机号格式有误!');
if (phone.length != 11) {
if (needToast) Fluttertoast.showToast(msg: '手机号格式有误!');
return false;
}
if(EmptyUtil.isEmpty(vcode)){
if(needToast) Fluttertoast.showToast(msg: '验证码不能为空!');
if (EmptyUtil.isEmpty(vcode)) {
if (needToast) Fluttertoast.showToast(msg: '验证码不能为空!');
return false;
}
if(vcode.length < 4){
if(needToast) Fluttertoast.showToast(msg: '验证码号格式有误!');
if (vcode.length < 4) {
if (needToast) Fluttertoast.showToast(msg: '验证码号格式有误!');
return false;
}
}else{
} else {
String phone = _phoneEdController?.text?.toString()?.trim() ?? null;
String pass = _passEdController?.text?.toString()?.trim() ?? null;
if(EmptyUtil.isEmpty(phone)){
if(needToast) Fluttertoast.showToast(msg: '手机号不能为空!');
String pass = _passEdController?.text?.toString()?.trim() ?? null;
if (EmptyUtil.isEmpty(phone)) {
if (needToast) Fluttertoast.showToast(msg: '手机号不能为空!');
return false;
}
if(phone.length != 11){
if(needToast) Fluttertoast.showToast(msg: '手机号格式有误!');
if (phone.length != 11) {
if (needToast) Fluttertoast.showToast(msg: '手机号格式有误!');
return false;
}
if(EmptyUtil.isEmpty(pass)){
if(needToast) Fluttertoast.showToast(msg: '验证码不能为空!');
if (EmptyUtil.isEmpty(pass)) {
if (needToast) Fluttertoast.showToast(msg: '验证码不能为空!');
return false;
}
if(pass.length < 4){
if(needToast) Fluttertoast.showToast(msg: '验证码号格式有误!');
if (pass.length < 4) {
if (needToast) Fluttertoast.showToast(msg: '验证码号格式有误!');
return false;
}
}

if(!_acceptAgreement){
if(needToast) Fluttertoast.showToast(msg: '请同意用户协议与隐私政策');
if (!_acceptAgreement) {
if (needToast) Fluttertoast.showToast(msg: '请同意用户协议与隐私政策');
return false;
}

@@ -174,14 +180,14 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
}

/// 检测手机号是否合法
bool _checkPhoneNumParam(bool needToast){
bool _checkPhoneNumParam(bool needToast) {
String phone = _phoneEdController?.text?.toString()?.trim() ?? null;
if(EmptyUtil.isEmpty(phone)){
if(needToast) Fluttertoast.showToast(msg: '手机号不能为空!');
if (EmptyUtil.isEmpty(phone)) {
if (needToast) Fluttertoast.showToast(msg: '手机号不能为空!');
return false;
}
if(phone.length != 11){
if(needToast) Fluttertoast.showToast(msg: '手机号格式有误!');
if (phone.length != 11) {
if (needToast) Fluttertoast.showToast(msg: '手机号格式有误!');
return false;
}
return true;
@@ -194,12 +200,11 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
bool _canSubmit = false;

/// 是否同意协议
bool _acceptAgreement = false;
bool _acceptAgreement = true;

/// 是否显示第三方验证码
bool _showOtherVcode = false;


@override
void initState() {
_phoneEdController = TextEditingController();
@@ -228,7 +233,7 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
@override
bool onVcodeClick() {
/// 获取验证码
if(_checkPhoneNumParam(true)) {
if (_checkPhoneNumParam(true)) {
BlocProvider.of<LoginAccountBloc>(context).add(LoginAccountGetVcodeEvent(mobile: _phoneEdController?.text?.toString()?.trim() ?? ''));
return true;
}
@@ -238,34 +243,36 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
@override
Widget build(BuildContext context) {
return BlocConsumer<LoginAccountBloc, LoginAccountState>(
listener: (context, state) {},
listener: (context, state) {
if (state is LoginAccountTypeVcodeLoginSuccessState) {}
},
buildWhen: (prev, current) {
// 验证码登陆失败
if(current is LoginAccountTypeVcodeLoginErrorState){
if (current is LoginAccountTypeVcodeLoginErrorState) {
Fluttertoast.showToast(msg: '登陆失败');
return false;
}
// 验证码登陆成功
if(current is LoginAccountTypeVcodeLoginSuccessState){
if(current?.model?.registerInviteCodeEnable == '0'){
if (current is LoginAccountTypeVcodeLoginSuccessState) {
/// 缓存登陆数据
Provider.of<UserInfoNotifier>(context, listen: false)?.setUserInfo(current.model);
if (current?.model?.registerInviteCodeEnable == '0') {
Fluttertoast.showToast(msg: '登陆成功~');
/// 缓存登陆数据
Provider.of<UserInfoNotifier>(context, listen: false).setUserInfo(current.model);
/// 打开也买
/// 打开也买
_openLoginSuccessPage();
}else{
} else {
/// 打开邀请页面
_openInvitePage();
}
return false;
}
// 获取验证码成功
if (current is LoginAccountGetVcodeSuccessState){
if (current is LoginAccountGetVcodeSuccessState) {
Fluttertoast.showToast(msg: '验证码下发成功');
return false;
}
// 获取验证码失败
if(current is LoginAccountGetVcodeErrorState){
if (current is LoginAccountGetVcodeErrorState) {
Fluttertoast.showToast(msg: '验证码获取失败~');
return false;
}
@@ -287,7 +294,6 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
print(model);
return Column(
children: <Widget>[

/// appBar
_getAppBarWidget(model),

@@ -331,10 +337,13 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
style: TextStyle(color: HexColor.fromHex(model?.mobile?.appBarTitleColor ?? '#333333')),
),
centerTitle: true,
leading: Icon(
Icons.arrow_back_ios,
size: 22,
color: HexColor.fromHex('#333333'),
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 22,
color: HexColor.fromHex('#333333'),
),
onPressed: () => _openPop(),
),
);
}
@@ -351,14 +360,15 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i

/// 手机输入框
Widget _getPhoneWidget(LoginModel model) {
return _getCustomInputWidget( hint: model?.mobile?.inputMobileHintText ?? '请输入您的手机号',
return _getCustomInputWidget(
hint: model?.mobile?.inputMobileHintText ?? '请输入您的手机号',
controller: _phoneEdController,
focusNode: _passFN,
onChanged: _onChange,
hintColor: model?.mobile?.inputHintColor ?? '#999999',
bgColor: model?.mobile?.inputBgColor ?? '#F7F7F7',
textColor: model?.mobile?.inputTextColor ?? '#333333',
iconUrl: model?.mobile?.inputMobileIcon?? '');
iconUrl: model?.mobile?.inputMobileIcon ?? '');
}

/// 验证码输入框
@@ -373,7 +383,7 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
onChanged: _onChange,
hintColor: model?.mobile?.inputHintColor ?? '#999999',
hint: model?.mobile?.inputVcodeHintText ?? '请输入您的验证码',
bgColor: model?.mobile?.inputBgColor ??'#F7F7F7',
bgColor: model?.mobile?.inputBgColor ?? '#F7F7F7',
textColor: model?.mobile?.inputTextColor ?? '#333333',
iconUrl: model?.mobile?.inputVcodeIcon ?? ''),
Align(alignment: Alignment.centerRight, child: _getVcodeButtonWidget(model)),
@@ -384,17 +394,15 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i

/// 验证码按钮
Widget _getVcodeButtonWidget(LoginModel model) {

return VcodeWidget(
onCallBack: this,
awaitTime: int.parse(model?.mobile?.vcodeTime ?? '60'),
btnAwaitText: '秒',
btnText: '获取验证码',
btnTextColor: model?.mobile?.btnVcodeTextColor ?? '#FFFFFF',
color: model?.mobile?.btnVcodeBgColor ?? '#FF4343',
disabledColor: model?.mobile?.btnVcodeBanBgColor ?? '#DDDDDD',
disabledTextColor: model?.mobile?.btnVcodeBanTextColor ?? '#FFFFFF'
);
onCallBack: this,
awaitTime: int.parse(model?.mobile?.vcodeTime ?? '60'),
btnAwaitText: '秒',
btnText: '获取验证码',
btnTextColor: model?.mobile?.btnVcodeTextColor ?? '#FFFFFF',
color: model?.mobile?.btnVcodeBgColor ?? '#FF4343',
disabledColor: model?.mobile?.btnVcodeBanBgColor ?? '#DDDDDD',
disabledTextColor: model?.mobile?.btnVcodeBanTextColor ?? '#FFFFFF');
}

/// 第三方验证码输入框
@@ -450,13 +458,8 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
behavior: HitTestBehavior.opaque,
onTap: () => _changeLoginTypeOnClick(),
child: Text(
_useVcode ? model?.mobile?.textUsePassTip ?? '使用密码登录' : model?.mobile?.textUseVcodeTip ?? '使用验证码登陆',
style: TextStyle(fontSize: 12,
color: HexColor.fromHex(
_useVcode ?
model?.mobile?.textUsePassTipColor ?? '#999999' :
model?.mobile?.textUseVcodeTipColor ?? '#999999'
)),
_useVcode ? model?.mobile?.textUsePassTip ?? '使用密码登录' : model?.mobile?.textUseVcodeTip ?? '使用验证码登陆',
style: TextStyle(fontSize: 12, color: HexColor.fromHex(_useVcode ? model?.mobile?.textUsePassTipColor ?? '#999999' : model?.mobile?.textUseVcodeTipColor ?? '#999999')),
),
);
}
@@ -473,10 +476,10 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
model?.mobile?.btnLoginText ?? '立即登录',
style: TextStyle(fontSize: 15),
),
textColor: HexColor.fromHex( model?.mobile?.btnLoginTextColor ?? '#FFFFFF'),
color: HexColor.fromHex( model?.mobile?.btnLoginBgColor ?? '#FF3939'),
disabledColor: HexColor.fromHex( model?.mobile?.btnLoginBanBgColor ?? '#F5F5F5'),
disabledTextColor: HexColor.fromHex( model?.mobile?.btnLoginBanTextColor ?? '#999999'),
textColor: HexColor.fromHex(model?.mobile?.btnLoginTextColor ?? '#FFFFFF'),
color: HexColor.fromHex(model?.mobile?.btnLoginBgColor ?? '#FF3939'),
disabledColor: HexColor.fromHex(model?.mobile?.btnLoginBanBgColor ?? '#F5F5F5'),
disabledTextColor: HexColor.fromHex(model?.mobile?.btnLoginBanTextColor ?? '#999999'),
elevation: 5,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(52 / 2)),
onPressed: _canSubmit ? _submitOnClick : null,
@@ -504,11 +507,17 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i

/// 协议文字
RichText(
text: TextSpan(text: '', children: model.mobile.protocol.map((item){
return TextSpan(text: item?.text, style: TextStyle(color: HexColor.fromHex(item?.textColor), fontSize: 10),recognizer: TapGestureRecognizer()..onTap = (){
_openAgreement(item.url);
});
}).toList()),
text: TextSpan(
text: '',
children: model.mobile.protocol.map((item) {
return TextSpan(
text: item?.text,
style: TextStyle(color: HexColor.fromHex(item?.textColor), fontSize: 10),
recognizer: TapGestureRecognizer()
..onTap = () {
_openAgreement(item.url);
});
}).toList()),
)
],
);
@@ -520,13 +529,14 @@ class _LoginAccountPageContianerState extends State<LoginAccountPageContianer> i
padding: const EdgeInsets.only(bottom: 25),
child: Text(
model?.mobile?.textBottomTip ?? '未注册过的手机将自动注册',
style: TextStyle(fontSize: 11, color: HexColor.fromHex( model?.mobile?.textBottomTipColor ?? '#999999')),
style: TextStyle(fontSize: 11, color: HexColor.fromHex(model?.mobile?.textBottomTipColor ?? '#999999')),
),
);
}

/// 自定义输入框
Widget _getCustomInputWidget({String hint, String hintColor, String bgColor, String textColor, String iconUrl, TextEditingController controller, ValueChanged<String> onChanged, FocusNode focusNode}) {
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(


+ 15
- 12
lib/pages/login_page/bloc/login_repository.dart ファイルの表示

@@ -1,3 +1,4 @@
import 'package:zhiying_base_widget/pages/login_page/login_util.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_comm/util/net_util.dart';
import 'package:zhiying_comm/util/empty_util.dart';
@@ -6,21 +7,23 @@ import 'package:zhiying_comm/util/global_config.dart';
class LoginRepository {
/// 获取页面数据
Future<LoginModel> fetchNetPageData() async {
var result = await NetUtil.post('/api/v1/sign/in', method: NetMethod.GET);
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
LoginModel model = LoginModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
return model;
}
return null;
// var result = await NetUtil.post('/api/v1/sign/in', method: NetMethod.GET, cache: true);
// if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
// LoginModel model = LoginModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
// return model;
// }
// return null;
return await LoginUtil.fetchNetPageData();
}

/// 获取缓存的页面数据
Future<LoginModel> fetchCachePageData() async {
var result = await NetUtil.getRequestCachedData('/api/v1/sign/in');
if (!EmptyUtil.isEmpty(result)) {
LoginModel model = LoginModel.fromJson(result);
return model;
}
return null;
// var result = await NetUtil.getRequestCachedData('/api/v1/sign/in');
// if (!EmptyUtil.isEmpty(result)) {
// LoginModel model = LoginModel.fromJson(result);
// return model;
// }
// return null;
return await LoginUtil.fetchCachePageData();
}
}

+ 4
- 4
lib/pages/login_page/invite/bloc/login_invite_bloc.dart ファイルの表示

@@ -6,7 +6,7 @@ import 'package:zhiying_comm/util/empty_util.dart';
import 'login_invite_repository.dart';

class LoginInviteBloc extends Bloc<LoginInviteEvent, LoginInviteState> {
LoginInviteRepostitory repostitory;
LoginInviteRepository repostitory;

LoginInviteBloc({@required this.repostitory});

@@ -45,9 +45,9 @@ class LoginInviteBloc extends Bloc<LoginInviteEvent, LoginInviteState> {
Stream<LoginInviteState> _mapQueryEventToState(LoginInviteQueryEvent event) async* {
var data = await repostitory.fetchInviteUserInfo(event);
if (!EmptyUtil.isEmpty(data))
yield LoginInviteQuerySuccess(model: data);
yield LoginInviteQuerySuccessState(model: data, pageMdel: repostitory?.pageModel);
else
yield LoginInviteQueryError();
yield LoginInviteQueryErrorState();
}

/// 提交
@@ -56,6 +56,6 @@ class LoginInviteBloc extends Bloc<LoginInviteEvent, LoginInviteState> {
if (!EmptyUtil.isEmpty(data))
yield LoginInviteSubmitSuccess(model: data);
else
yield LoginInviteSubmitError();
yield LoginInviteSubmitErrorState();
}
}

+ 19
- 11
lib/pages/login_page/invite/bloc/login_invite_repository.dart ファイルの表示

@@ -1,39 +1,47 @@
import 'package:zhiying_base_widget/pages/login_page/invite/bloc/bloc.dart';
import 'package:zhiying_base_widget/pages/login_page/invite/model/login_invite_user.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_user.dart';
import 'package:zhiying_comm/util/empty_util.dart';
import 'package:zhiying_comm/util/net_util.dart';
import 'package:zhiying_comm/util/global_config.dart';
import 'package:zhiying_comm/models/user/user_info_model.dart';
import '../../login_util.dart';

class LoginInviteRepostitory {
class LoginInviteRepository {
LoginModel pageModel;

/// 获取数据,如果缓存有,则获取缓存的数据
Future<LoginModel> fetchData() async {
var result = await LoginUtil.getLoginModel();
if (!EmptyUtil.isEmpty(result)) {
return result;
pageModel = await LoginUtil.getLoginModel();
if (!EmptyUtil.isEmpty(pageModel)) {
return pageModel;
}
return null;
}

/// 获取邀请人信息
Future<LoginInviteUser> fetchInviteUserInfo(LoginInviteQueryEvent event) async {
var result = await NetUtil.post('/api/v1/user/invite/${event.num}');
var result = await NetUtil.post('/api/v1/user/invite/${event.num}', method: NetMethod.GET);
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
LoginInviteUser model = LoginInviteUser.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
return model;
if(null != model)
return model;
else return null;
} else {
return null;
}
}

/// 提交
Future<LoginUser> submitInvite(LoginInviteSubmitEvent event) async {
var result = await NetUtil.post('/api/v1/user/invite/ack', params: {'mobile': event.mobile, 'superior_user_id': event.num});
Future<UserInfoModel> submitInvite(LoginInviteSubmitEvent event) async {
var result = await NetUtil.post('/api/v1/user/invite/ack', params: {'mobile': event.mobile, 'parent_uid': event.num});
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
LoginUser model = LoginUser.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
return model;
UserInfoModel model = UserInfoModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
if (null != model) {
model.mobile = event.mobile;
return model;
}
return null;
}
return null;
}


+ 9
- 8
lib/pages/login_page/invite/bloc/login_invite_state.dart ファイルの表示

@@ -2,7 +2,7 @@ import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart';
import 'package:zhiying_base_widget/pages/login_page/invite/model/login_invite_user.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_user.dart';
import 'package:zhiying_comm/models/user/user_info_model.dart';

abstract class LoginInviteState extends Equatable {
const LoginInviteState();
@@ -36,7 +36,7 @@ class LoginInviteErrorState extends LoginInviteState {

/// 邀请码成功
class LoginInviteSubmitSuccess extends LoginInviteState {
final LoginUser model;
final UserInfoModel model;

const LoginInviteSubmitSuccess({@required this.model});

@@ -45,30 +45,31 @@ class LoginInviteSubmitSuccess extends LoginInviteState {
}

/// 邀请码失败
class LoginInviteSubmitError extends LoginInviteState {
class LoginInviteSubmitErrorState extends LoginInviteState {
final String msg;

const LoginInviteSubmitError({this.msg});
const LoginInviteSubmitErrorState({this.msg});

@override
List<Object> get props => [this.msg];
}

/// 查询邀请人成功
class LoginInviteQuerySuccess extends LoginInviteState {
class LoginInviteQuerySuccessState extends LoginInviteState {
final LoginInviteUser model;
final LoginModel pageMdel;

const LoginInviteQuerySuccess({@required this.model});
const LoginInviteQuerySuccessState({@required this.model, @required this.pageMdel});

@override
List<Object> get props => [this.model];
}

/// 查询邀请人失败
class LoginInviteQueryError extends LoginInviteState {
class LoginInviteQueryErrorState extends LoginInviteState {
final String msg;

const LoginInviteQueryError({this.msg});
const LoginInviteQueryErrorState({this.msg});

@override
List<Object> get props => [this.msg];


+ 278
- 10
lib/pages/login_page/invite/login_invite_page.dart ファイルの表示

@@ -1,9 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:provider/provider.dart';
import 'package:zhiying_base_widget/pages/login_page/invite/bloc/bloc.dart';
import 'package:zhiying_base_widget/pages/login_page/invite/bloc/login_invite_repository.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_model.dart';
import 'package:zhiying_comm/zhiying_comm.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:zhiying_comm/util/empty_util.dart';

import 'model/login_invite_user.dart';

@@ -11,14 +14,13 @@ import 'model/login_invite_user.dart';
/// 邀请页面
///
class LoginInvitePage extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: HexColor.fromHex('#FFFFFF'),
body: BlocProvider(
create: (_) => LoginInviteBloc(repostitory: LoginInviteRepostitory())..add(LoginInviteInitEvent()),
create: (_) => LoginInviteBloc(repostitory: LoginInviteRepository())..add(LoginInviteInitEvent()),
child: LoginInvitePageContainer(),
),
);
@@ -33,15 +35,121 @@ class LoginInvitePageContainer extends StatefulWidget {
}

class _LoginInvitePageContainerState extends State<LoginInvitePageContainer> {
TextEditingController _editingController;
FocusNode _focusNode;
bool _showInviteInfo = false;

/// 返回上一页
void _openPop() {
if (Navigator.canPop(context)) {
Navigator.pop(context);
}
}

/// 注册成功跳转
void _successJump(){
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();

/// 邀请码
String inviteNum = inviteUser?.userId ?? '';

/// 手机号
String mobile = Provider.of<UserInfoNotifier>(context, listen: false)?.getUserInfoModel()?.mobile ?? '';
if (!EmptyUtil.isEmpty(inviteNum) && !EmptyUtil.isEmpty(mobile)) {
BlocProvider.of<LoginInviteBloc>(context).add(LoginInviteSubmitEvent(mobile: mobile, num: inviteNum));
}
}

@override
void initState() {
_editingController = TextEditingController();
_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) {
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();
},
@@ -49,24 +157,184 @@ class _LoginInvitePageContainerState extends State<LoginInvitePageContainer> {
}

/// 主视图
Widget _getMainWidget(LoginModel model) {
return Column(children: <Widget>[
Widget _getMainWidget(LoginModel 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(LoginModel model) {}
Widget _getAppBar(LoginModel model) {
return AppBar(
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(LoginModel model) {}
Widget _getTitleWidget(LoginModel model) {
return Align(
alignment: Alignment.centerLeft,
child: Text(
model?.invite?.title ?? '输入邀请码',
style: TextStyle(color: HexColor.fromHex(model?.invite?.titleColor ?? '#333333'), fontSize: 25),
));
}

/// 邀请码输入框
Widget _getInviteInputWidget(LoginModel model) {}
Widget _getInviteInputWidget(LoginModel 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) {}
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 _getSubmitButtomWidget(LoginModel model) {}
Widget _getSubmiBtnWidget(LoginModel model, LoginInviteUser inviteUser) {
return Material(
child: Container(
height: 52,
width: double.infinity,
color: Colors.white,
child: RaisedButton(
child: Text(
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.number,
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,
),
),
),
],
),
);
}
}

+ 12
- 3
lib/pages/login_page/invite/model/login_invite_user.dart ファイルの表示

@@ -2,13 +2,19 @@ class LoginInviteUser {
String userId;
String nickname;
String appName;
String nickNameColor;
String appNameColor;
String avatar;

LoginInviteUser({this.userId, this.nickname, this.appName});

LoginInviteUser.fromJson(Map<String, dynamic> json) {
userId = json['user_id'];
nickname = json['nickname'];
appName = json['app_name'];
userId = json['user_id']?.toString();
nickname = json['nickname']?.toString();
appName = json['app_name']?.toString();
avatar = json['avatar']?.toString();
appNameColor = json['app_name_color']?.toString();
nickNameColor = json['nickname_color']?.toString();
}

Map<String, dynamic> toJson() {
@@ -16,6 +22,9 @@ class LoginInviteUser {
data['user_id'] = this.userId;
data['nickname'] = this.nickname;
data['app_name'] = this.appName;
data['nickname_color'] = this.nickNameColor;
data['app_name_color'] = this.appNameColor;
data['avatar'] = this.avatar;
return data;
}
}

+ 14
- 4
lib/pages/login_page/login_page.dart ファイルの表示

@@ -47,6 +47,13 @@ class _LoginPageContainerState extends State<LoginPageContainer> {
}
}

/// 返回上一页
void _openPop(){
if(Navigator.canPop(context)){
Navigator.pop(context);
}
}

/// 第三方登陆
void _otherLoginClick(BottomIcons model) {
print('第三方登陆${model.type}');
@@ -134,10 +141,13 @@ class _LoginPageContainerState extends State<LoginPageContainer> {
AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leading: Icon(
Icons.arrow_back_ios,
size: 22,
color: HexColor.fromHex('#333333'),
leading: IconButton(
icon: Icon(
Icons.arrow_back_ios,
size: 22,
color: HexColor.fromHex('#333333'),
),
onPressed: ()=> _openPop(),
),
),
Column(


+ 5
- 5
lib/pages/login_page/login_util.dart ファイルの表示

@@ -18,9 +18,9 @@ class LoginUtil{

/// 获取数据
static Future<LoginModel> getLoginModel() async{
var cache = await _fetchCachePageData();
var cache = await fetchCachePageData();
if (!EmptyUtil.isEmpty(cache)) return cache;
var result = await _fetchNetPageData();
var result = await fetchNetPageData();
if(!EmptyUtil.isEmpty(result)) return result;

return null;
@@ -34,7 +34,7 @@ class LoginUtil{


/// 获取缓存的页面数据
static Future<LoginModel> _fetchCachePageData() async {
static Future<LoginModel> fetchCachePageData() async {
var result = await NetUtil.getRequestCachedData(_URL);
if (!EmptyUtil.isEmpty(result)) {
LoginModel model = LoginModel.fromJson(result);
@@ -44,8 +44,8 @@ class LoginUtil{
}

/// 获取页面数据
static Future<LoginModel> _fetchNetPageData() async {
var result = await NetUtil.post(_URL, method: NetMethod.GET);
static Future<LoginModel> fetchNetPageData() async {
var result = await NetUtil.post(_URL, method: NetMethod.GET, cache: true);
if (NetUtil.isSuccess(result) && !EmptyUtil.isEmpty(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA])) {
LoginModel model = LoginModel.fromJson(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
return model;


+ 0
- 43
lib/pages/login_page/model/login_user.dart ファイルの表示

@@ -1,43 +0,0 @@
/// token : "6209c60befba0f34c3ade079409337713ddab9c5"
/// user_id : "55"
/// username : "1328603811x"
/// perms : ["app_zhiyingshenghuo_access"]
/// register_invite_code_enable : "0"

class LoginUser {
String token;
String userId;
String username;
List<String> perms;
String registerInviteCodeEnable;

LoginUser(
{this.token,
this.userId,
this.username,
this.perms,
this.registerInviteCodeEnable});

LoginUser.fromJson(Map<String, dynamic> json) {
token = json['token'];
userId = json['user_id'];
username = json['username'];
perms = json['perms'].cast<String>();
registerInviteCodeEnable = json['register_invite_code_enable'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['token'] = this.token;
data['user_id'] = this.userId;
data['username'] = this.username;
data['perms'] = this.perms;
data['register_invite_code_enable'] = this.registerInviteCodeEnable;
return data;
}

@override
String toString() {
return 'LoginUser{token: $token, userId: $userId, username: $username, perms: $perms, registerInviteCodeEnable: $registerInviteCodeEnable}';
}
}

+ 0
- 35
lib/pages/login_page/notifier/user_info_notifier.dart ファイルの表示

@@ -1,35 +0,0 @@
import 'package:flutter/material.dart';
import 'package:zhiying_base_widget/pages/login_page/model/login_user.dart';
import 'package:zhiying_comm/util/empty_util.dart';

///
/// 用户信息
///
class UserInfoNotifier with ChangeNotifier {
LoginUser userInfo;

/// 更新用户数据
void setUserInfo(LoginUser loginUser) {
print('${loginUser.toString()}');
this.userInfo = loginUser;
// 缓存数据 TODO

}

/// 退出登陆
void unLogin(){
this.userInfo = null;
// 清除缓存数据 TODO
}

/// 获取登陆数据
LoginUser getLoginUserInfo(){
if(null != userInfo){
return userInfo;
}
// TODO 需要读取缓存的数据?
return null;
}


}

+ 11
- 19
lib/register.dart ファイルの表示

@@ -18,6 +18,7 @@ import 'package:zhiying_base_widget/widgets/wallet/wallet_data/wallet_data.dart'
import 'package:zhiying_base_widget/widgets/wallet/wallet_detail/wallet_detail.dart';
import 'package:zhiying_base_widget/widgets/wallet/wallet_income/wallet_income.dart';
import 'package:zhiying_comm/zhiying_comm.dart';
import 'package:zhiying_comm/util/defalut_widget_creater.dart';

import 'pages/login_page/account/login_account_page.dart';
import 'pages/login_page/invite/login_invite_page.dart';
@@ -55,7 +56,7 @@ class BaseWidgetRegister {
// /// 可滚动banner
WidgetFactory.regist('index_carousel', HomeSlideBannerCreater());
WidgetFactory.regist('index_recommend_list', GoodsListCreater());
// 首页快速入口
/// 首页快速入口
WidgetFactory.regist('home_quick_entry', HomeQuickEntryCreater());
//
// /// 首页快速入口
@@ -67,26 +68,17 @@ class BaseWidgetRegister {

// ==================== 个人中心
WidgetFactory.regist('profile_appbar', MineNavCreater());
WidgetFactory.regist('profile_background',
DefaultWidgetCreater((model) => MineNavBg(model)));
WidgetFactory.regist(
'profile_header', DefaultWidgetCreater((model) => MineHeader(model)));
WidgetFactory.regist(
'profile_earning', DefaultWidgetCreater((model) => MineData()));
WidgetFactory.regist(
'profile_functions', DefaultWidgetCreater((model) => MineQuickEntry()));
WidgetFactory.regist('profile_my_functions',
DefaultWidgetCreater((model) => MineQuickEntry()));
WidgetFactory.regist('profile_carousel',
DefaultWidgetCreater((model) => HomeBannerWidget(model)));
WidgetFactory.regist('profile_background', DefaultWidgetCreater((model) => MineNavBg(model)));
WidgetFactory.regist('profile_header', DefaultWidgetCreater((model) => MineHeader(model)));
WidgetFactory.regist('profile_earning', DefaultWidgetCreater((model) => MineData()));
WidgetFactory.regist('profile_functions', DefaultWidgetCreater((model) => MineQuickEntry()));
WidgetFactory.regist('profile_my_functions', DefaultWidgetCreater((model) => MineQuickEntry()));
WidgetFactory.regist('profile_carousel', DefaultWidgetCreater((model) => HomeBannerWidget(model)));

// ==================== 钱包
WidgetFactory.regist(
'wallet_data', DefaultWidgetCreater((model) => WalletData()));
WidgetFactory.regist(
'wallet_detail', DefaultWidgetCreater((model) => WalletDetail()));
WidgetFactory.regist('wallet_data', DefaultWidgetCreater((model) => WalletData()));
WidgetFactory.regist('wallet_detail', DefaultWidgetCreater((model) => WalletDetail()));

WidgetFactory.regist(
'wallet_income', DefaultWidgetCreater((model) => WalletIncome()));
WidgetFactory.regist('wallet_income', DefaultWidgetCreater((model) => WalletIncome()));
}
}

+ 1
- 3
lib/widgets/home/home_banner/bloc/home_banner_repository.dart ファイルの表示

@@ -17,9 +17,7 @@ class HomeBannerRepository {

/// 获取网路数据
Future<HomeBannerModel> fetchNetData({@required int modId}) async {
var result = await NetUtil.post('/api/v1/mod', params: {
'ids': [modId]
});
var result = await NetUtil.post('/api/v1/mod', params: {'ids': [modId]}, cache: true);
if (NetUtil.isSuccess(result)) {
return HomeBannerModel();
}


+ 1
- 1
lib/widgets/home/home_goods/bloc/home_goods_header_bloc.dart ファイルの表示

@@ -14,7 +14,7 @@ class HomeGoodsHeaderBloc extends BlocBase {

@override
void dispose() {
_tabController.close();
_tabController?.close();
_tabController = null;
}



+ 1
- 1
lib/widgets/home/home_quick_entry/bloc/home_quick_entry_repository.dart ファイルの表示

@@ -5,7 +5,7 @@ class HomeQuickEntryRepository {

/// 获取数据
Future<dynamic> fetchData() async {
var result = await NetUtil.post('/api/v1/mod', params: {'ids':[7]});
var result = await NetUtil.post('/api/v1/mod', params: {'ids':[7]}, cache: true);
if(NetUtil.isSuccess(result)){

}


+ 1
- 1
lib/widgets/home/home_slide_banner/bloc/home_slide_banner_repository.dart ファイルの表示

@@ -24,7 +24,7 @@ class HomeSlideBannerRepository {
Future<List<HomeSlideBannerModelItems>> fetchData({@required int id}) async {
var params = await NetUtil.post('/api/v1/mod', params: {
'ids': [id]
});
}, cache: true);
if (!EmptyUtil.isEmpty(params) && NetUtil.isSuccess(params)) {
HomeSlideBannerModel model = HomeSlideBannerModel.fromJson(
params[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);


+ 0
- 37
lib/widgets/home_slide_banner/bloc/home_slide_banner_repository.dart ファイルの表示

@@ -1,37 +0,0 @@
import 'package:flutter/cupertino.dart';
import 'package:zhiying_base_widget/widgets/home/home_slide_banner/model/home_slide_banner_model.dart';
import 'package:zhiying_comm/util/empty_util.dart';
import 'package:zhiying_comm/util/global_config.dart';
import 'package:zhiying_comm/util/net_util.dart';

class HomeSlideBannerRepository {
/// 获取缓存数据
Future<List<HomeSlideBannerModelItems>> fetchCachedDate(
{@required int id}) async {
var cached = await NetUtil.getRequestCachedData('/api/v1/mod', params: {
'ids': [id]
});
if (!EmptyUtil.isEmpty(cached)) {
HomeSlideBannerModel model = HomeSlideBannerModel.fromJson(cached);
if (null != model && !EmptyUtil.isEmpty(model.items)) {
return model.items;
}
}
return null;
}

/// 获取数据
Future<List<HomeSlideBannerModelItems>> fetchData({@required int id}) async {
var params = await NetUtil.post('/api/v1/mod', params: {
'ids': [id]
});
if (NetUtil.isSuccess(params)) {
HomeSlideBannerModel model = HomeSlideBannerModel.fromJson(
params[GlobalConfig.HTTP_RESPONSE_KEY_DATA]);
if (null != model && !EmptyUtil.isEmpty(model.items)) {
return model.items;
}
}
return null;
}
}

読み込み中…
キャンセル
保存