我正在使用 getx 包和 Laravel 作为后端制作一个 flutter 应用程序,当我从该应用程序注册一个新用户时,它成功地在我的数据库(管理面板、sqlWorkbench 和 phpMyadmin)中注册,所有内容都存储在本地。 但是当我尝试登录时 它一直在我的案例中抛出一个禁止的错误(无效的密码或电子邮件),即使我的邮递员登录帖子请求工作正常。 这是我的 api_clien.dart
`import 'package:get/get.dart';
import '../../utils/constants.dart';
class ApiClient extends GetConnect implements GetxService {
late String token;
final String appBaseUrl;
late Map<String, String> _mainHeaders;
ApiClient({required this.appBaseUrl}) {
baseUrl = appBaseUrl;
timeout = const Duration(seconds: 30);
token = Constants.token;
_mainHeaders = {
'Content-type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer $token',
};
}
void updateHeader(String token) {
_mainHeaders = {
'Content-type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer $token',
};
}
Future<Response> getData(String uri) async {
try {
Response response = await get(uri);
return response;
} catch (e) {
return Response(
statusCode: 1,
statusText: e.toString(),
);
}
}
Future<Response> postData(String uri, dynamic body) async {
print(body.toString());
try {
Response response = await post(uri, body, headers: _mainHeaders);
print(response.toString());
return response;
} catch (e) {
print(e.toString());
return Response(statusCode: 1, statusText: e.toString());
}
}
Future<Response> login(String email, String password) async {
final body = {
Constants.EMAIL: email,
Constants.PASSWORD: password,
};
return await postData(Constants.loginUri, body);
}
}`
我的 auth_repo.dart
class AuthRepo {
final ApiClient apiClient;
final SharedPreferences sharedPreferences;
AuthRepo({
required this.apiClient,
required this.sharedPreferences,
});
Future<Response> registration(SignUpBody signUpBody) async {
return await apiClient.postData(
Constants.registrationUri,
signUpBody.toJson(),
);
}
Future<Response> login(String email, String password) async {
return await apiClient.login(email, password);
}
Future<String> getUserToken() async {
return sharedPreferences.getString(Constants.token) ?? "None";
}
Future<bool> saveUserToken(String token) async {
print('Saving user token: $token');
apiClient.token = token;
apiClient.updateHeader(token);
return await sharedPreferences.setString(Constants.token, token);
}
Future<void> saveUserNumberAndPassword(String email, String password) async {
try {
await sharedPreferences.setString(Constants.EMAIL, email);
await sharedPreferences.setString(Constants.PASSWORD, password);
} catch (e) {
throw e;
}
}
}
auth_controller.dart
`import 'package:get/get.dart';
import 'package:project/data/repository/auth_repo.dart';
import 'package:project/models/response_model.dart';
import 'package:project/models/sign_up_model.dart';
class AuthController extends GetxController implements GetxService {
final AuthRepo authRepo;
AuthController({required this.authRepo});
bool _isLoading = false;
bool get isLoading => _isLoading;
Future<ResponseModel> registration(SignUpBody signUpBody) async {
_isLoading = true;
update();
Response response = await authRepo.registration(signUpBody);
late ResponseModel responseModel;
if (response.statusCode == 200) {
authRepo.saveUserToken(response.body["token"]);
responseModel = ResponseModel(true, response.body["token"]);
} else {
responseModel = ResponseModel(false, response.statusText!);
}
_isLoading = false;
update();
return responseModel;
}
Future<ResponseModel> login(String email, String password) async {
_isLoading = true;
update();
Response response = await authRepo.login(email, password);
late ResponseModel responseModel;
if (response.statusCode == 200) {
authRepo.saveUserToken(response.body["token"]);
responseModel = ResponseModel(true, response.body["token"]);
} else {
responseModel = ResponseModel(false, response.statusText!);
}
_isLoading = false;
update();
return responseModel;
}
void saveUserNumberAndPassword(String email, String password) {
authRepo.saveUserNumberAndPassword(email, password);
}
}
login_model.dart
class LoginBody {
final String email;
final String password;
LoginBody({
required this.email,
required this.password,
});
Map<String, dynamic> toJson() => {
"email": email,
"password": password,
};
}
这是我的 sign_in_screen.dart
class SignInScreen extends StatelessWidget {
const SignInScreen({super.key});
@override
Widget build(BuildContext context) {
var passwordController = TextEditingController();
var emailController = TextEditingController();
final AuthController authController = Get.find();
void login() async {
String password = passwordController.text.trim();
String email = emailController.text.trim();
if (password.isEmpty) {
showCustomSnackBar('Please enter your password');
return;
}
if (email.isEmpty) {
showCustomSnackBar('Please enter your email');
return;
}
authController.login(password, email).then(
(status) {
if (status.isSuccess) {
// Navigate to the home screen if login is successful
Get.offAllNamed(Routes.getCartScreen());
} else {
// Show an error message if login fails
showCustomSnackBar('Invalid password or email number');
}
},
);
}
return Scaffold(
body: GetBuilder<AuthController>(
builder: (authController) {
return SingleChildScrollView(
physics: const BouncingScrollPhysics(),
child: Column(
children: [
SizedBox(height: Dimensions.screenHeight * 0.05),
Container(
child: const Center(
child: CircleAvatar(
radius: 80,
backgroundImage: AssetImage("assets/images/image3.jpg"),
),
),
),
SizedBox(height: Dimensions.height30),
Container(
width: double.maxFinite,
margin: EdgeInsets.only(
left: Dimensions.width20,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Welcome",
style: TextStyle(
fontSize: Dimensions.font30 * 2 + 10,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: Dimensions.height30),
Text(
"Enter your credentials! ",
style: TextStyle(
fontSize: Dimensions.font26,
color: Colors.grey[500],
),
),
],
),
),
SizedBox(height: Dimensions.height45),
AppTextField(
iconColor: mainColor,
textController: emailController,
hintText: "email ",
icon: Icons.email,
),
SizedBox(height: Dimensions.height20),
AppTextField(
iconColor: mainColor,
textController: passwordController,
hintText: "Password",
isObscure: true,
icon: Icons.password,
),
SizedBox(height: Dimensions.height20),
SizedBox(height: Dimensions.height20 + Dimensions.height20),
GestureDetector(
onTap: () {
print("tapped");
login();
},
child: Container(
width: Dimensions.screenWidth / 2,
height: Dimensions.screenHeight / 13,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(Dimensions.radius30),
color: mainColor,
),
child: Center(
child: Text1(
text: "SignIn",
size: Dimensions.font26,
color: Colors.white,
),
),
),
),
SizedBox(height: Dimensions.height45 + 10),
RichText(
text: TextSpan(
text: "Don't have an account? ",
style: TextStyle(
color: Colors.grey[500],
fontSize: Dimensions.font26 - 6,
),
children: [
TextSpan(
recognizer: TapGestureRecognizer()
..onTap = () => Get.to(
() => const SignUpScreen(),
transition: Transition.fade,
),
text: " Create one",
style: TextStyle(
color: Colors.black,
fontSize: Dimensions.font26 - 4,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
),
);
},
),
);
}
}
我今天花了一整天试图解决这个问题(尝试了不同的代码变体,甚至删除了所有与登录相关的内容并重新编写,卸载了应用程序)但我找不到任何解决方案,我不知道怎么办,这么关键的一步,我卡住了。