Commit e477d911 by tanghuan

调整通过Apple登录的流程

1 parent a293b024
......@@ -18,6 +18,7 @@ class LoginMainState extends Equatable {
final int loginType; // 1=Wechat,2=Apple
final String appleUserIdentifier;
final bool loading;
final bool wechatInstalled;
const LoginMainState({
this.agreed = false,
......@@ -26,6 +27,7 @@ class LoginMainState extends Equatable {
this.loginType = 0,
this.appleUserIdentifier = '',
this.loading = false,
this.wechatInstalled = false,
});
LoginMainState copyWith({
......@@ -33,16 +35,18 @@ class LoginMainState extends Equatable {
bool? showAgreed,
bool? showNeedWechatForApple,
int? loginType,
bool? loading,
String? appleUserIdentifier,
bool? loading,
bool? wechatInstalled,
}) {
return LoginMainState(
agreed: agreed ?? this.agreed,
showAgreed: showAgreed ?? this.showAgreed,
showNeedWechatForApple: showNeedWechatForApple ?? this.showNeedWechatForApple,
loginType: loginType ?? this.loginType,
loading: loading ?? this.loading,
appleUserIdentifier: appleUserIdentifier ?? this.appleUserIdentifier,
loading: loading ?? this.loading,
wechatInstalled: wechatInstalled ?? this.wechatInstalled,
);
}
......@@ -50,10 +54,11 @@ class LoginMainState extends Equatable {
List<Object?> get props => [
agreed,
showAgreed,
loading,
showNeedWechatForApple,
loginType,
appleUserIdentifier,
loading,
wechatInstalled,
];
}
......@@ -65,6 +70,12 @@ class LoginMainCubit extends Cubit<LoginMainState> {
LoginMainCubit(super.initialState) {
_fluwx = getIt.get<Fluwx>();
// 处理微信安装检测
_fluwx.isWeChatInstalled.then((value) {
emit(state.copyWith(wechatInstalled: value));
});
_fluwxCancelable = _fluwx.addSubscriber(_responseListener);
_wechatAuthRepository = getIt.get<WechatAuthRepository>();
_userAuthRepository = getIt.get<UserAuthRepository>();
......@@ -136,8 +147,15 @@ class LoginMainCubit extends Cubit<LoginMainState> {
if (binding == 1) {
_handleLoginSuccess(data);
} else {
// 未绑定时,也会返回 sessionCode 和 userCode
if (state.wechatInstalled) {
// 已安装微信APP,直接拉起微信授权,不使用 sessionCode 和 userCode
// 设置 appleUserIdentifier 状态,通知用户需要授权微信认证
emit(state.copyWith(appleUserIdentifier: data['appleUid']!, showNeedWechatForApple: true));
} else {
// 未安装微信APP,使用 sessionCode 和 userCode
_handleLoginSuccess(data);
}
}
}
......@@ -215,7 +233,11 @@ class LoginMainCubit extends Cubit<LoginMainState> {
void _handleLoginSuccess(Map<String, dynamic> data) {
var roles = data['roles'];
// 过滤出家长角色的数据
if (roles?.isNotEmpty ?? false) {
roles.removeWhere((element) => element['userType'] != 2);
} else {
roles = [];
}
var sessionCode = data['sessionCode'];
var userCode = data['userCode'];
......
......@@ -146,7 +146,11 @@ class LoginPhoneCubit extends Cubit<LoginPhoneState> {
void _handleLoginSuccess(Map<String, dynamic> data) {
var roles = data['roles'];
// 过滤出家长角色的数据
if (roles?.isNotEmpty ?? false) {
roles.removeWhere((element) => element['userType'] != 2);
} else {
roles = [];
}
var sessionCode = data['sessionCode'];
var userCode = data['userCode'];
......
import 'dart:io';
import 'package:appframe/bloc/login_main_cubit.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/ui/widgets/login/login_page_agreed_widget.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:fluwx/fluwx.dart';
import 'package:sign_in_with_apple/sign_in_with_apple.dart';
class LoginMainPage extends StatelessWidget {
......@@ -39,27 +37,8 @@ class LoginMainPage extends StatelessWidget {
SizedBox(height: 15),
]
: [];
var scaffold = Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
children: [
SizedBox(height: 100),
Center(
child: Image.asset(
'assets/images/login_v2/banner_1.png',
),
),
SizedBox(height: 30),
Center(
child: Image.asset(
'assets/images/login_v2/main.png',
),
),
SizedBox(height: 40),
...appleLoginBtn,
var wechatLoginBtn = (!Platform.isIOS || state.wechatInstalled)
? [
Padding(
padding: EdgeInsets.symmetric(horizontal: 42.5),
child: SizedBox(
......@@ -67,7 +46,7 @@ class LoginMainPage extends StatelessWidget {
height: 50,
child: ElevatedButton(
onPressed: () async {
if (await getIt.get<Fluwx>().isWeChatInstalled) {
if (state.wechatInstalled) {
loginMainCubit.wechatAuth();
} else {
if (!context.mounted) return;
......@@ -94,6 +73,30 @@ class LoginMainPage extends StatelessWidget {
),
),
SizedBox(height: 15),
]
: [];
var scaffold = Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
children: [
SizedBox(height: 100),
Center(
child: Image.asset(
'assets/images/login_v2/banner_1.png',
),
),
SizedBox(height: 30),
Center(
child: Image.asset(
'assets/images/login_v2/main.png',
),
),
SizedBox(height: 40),
...appleLoginBtn,
...wechatLoginBtn,
_buildAgreement(context, loginMainCubit, state.agreed),
SizedBox(height: 82.5),
Text(
......
import 'dart:io';
import 'package:appframe/bloc/login_phone_cubit.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/ui/widgets/login/login_page_agreed_widget.dart';
......@@ -16,30 +18,42 @@ class LoginPhonePage extends StatelessWidget {
child: BlocConsumer<LoginPhoneCubit, LoginPhoneState>(
builder: (ctx, state) {
var loginPhoneCubit = ctx.read<LoginPhoneCubit>();
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
var iosBackHome = Platform.isIOS
? [
InkWell(
onTap: () {
loginPhoneCubit.goLoginMain();
},
borderRadius: BorderRadius.circular(4),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Image.asset(
'assets/images/login_v2/banner_2.png',
width: MediaQuery.of(context).size.width,
fit: BoxFit.fitWidth,
Icon(
Icons.arrow_back_ios,
size: 16,
color: Color(0xFF7691FA),
),
SizedBox(height: 15.5),
Padding(
padding: EdgeInsets.symmetric(horizontal: 30),
child: Column(children: [
_buildInputFields(loginPhoneCubit, state),
SizedBox(height: 15),
_buildLoginButton(ctx),
]),
SizedBox(width: 4),
Text(
'其他方式登录',
style: TextStyle(
fontSize: 14,
color: Color(0xFF7691FA),
decoration: TextDecoration.underline,
decorationColor: Color(0xFF7691FA),
),
SizedBox(height: 15),
_buildAgreement(ctx, loginPhoneCubit, state.agreed),
SizedBox(height: 140),
strutStyle: StrutStyle(height: 16 / 14),
),
],
),
),
),
]
: [];
var androidBackHome = Platform.isAndroid
? [
Text(
'其他方式登录',
style: TextStyle(
......@@ -71,6 +85,34 @@ class LoginPhonePage extends StatelessWidget {
),
],
),
]
: [];
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
children: [
Image.asset(
'assets/images/login_v2/banner_2.png',
width: MediaQuery.of(context).size.width,
fit: BoxFit.fitWidth,
),
SizedBox(height: 15.5),
Padding(
padding: EdgeInsets.symmetric(horizontal: 30),
child: Column(children: [
_buildInputFields(loginPhoneCubit, state),
SizedBox(height: 15),
_buildLoginButton(ctx),
]),
),
SizedBox(height: 15),
_buildAgreement(ctx, loginPhoneCubit, state.agreed),
SizedBox(height: 140),
...iosBackHome,
...androidBackHome,
],
),
),
......
import 'dart:io';
import 'package:appframe/bloc/login_qr_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
......@@ -12,24 +14,44 @@ class LoginQrPage extends StatelessWidget {
child: BlocConsumer<LoginQrCubit, LoginQrState>(
builder: (context, state) {
var loginQrCubit = context.read<LoginQrCubit>();
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
var iosBackHome = Platform.isIOS
? [
Center(
child: InkWell(
onTap: () {
loginQrCubit.goLoginMain();
},
borderRadius: BorderRadius.circular(4),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Image.asset(
'assets/images/login_v2/banner_2.png',
width: MediaQuery.of(context).size.width,
fit: BoxFit.fitWidth,
Icon(
Icons.arrow_back_ios,
size: 16,
color: Color(0xFF7691FA),
),
SizedBox(
height: 380,
child: _buildQrCode(loginQrCubit, state),
SizedBox(width: 4),
Text(
'其他方式登录',
style: TextStyle(
fontSize: 14,
color: Color(0xFF7691FA),
decoration: TextDecoration.underline,
decorationColor: Color(0xFF7691FA),
),
SizedBox(height: 20),
strutStyle: StrutStyle(height: 16 / 14),
),
],
),
),
),
),
]
: [];
var androidBackHome = Platform.isAndroid
? [
Center(
child: Text(
'其他方式登录',
......@@ -54,6 +76,28 @@ class LoginQrPage extends StatelessWidget {
),
],
),
]
: [];
return Scaffold(
backgroundColor: Colors.white,
body: SafeArea(
top: false,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Image.asset(
'assets/images/login_v2/banner_2.png',
width: MediaQuery.of(context).size.width,
fit: BoxFit.fitWidth,
),
SizedBox(
height: 380,
child: _buildQrCode(loginQrCubit, state),
),
SizedBox(height: 20),
...iosBackHome,
...androidBackHome,
],
),
),
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!