使用我的 flutter 应用程序登录失败,但可以与邮递员一起使用

问题描述 投票:0回答:0

我正在使用 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,
),
),
],
),
),
],
),
);
},
),
);
}
}

我今天花了一整天试图解决这个问题(尝试了不同的代码变体,甚至删除了所有与登录相关的内容并重新编写,卸载了应用程序)但我找不到任何解决方案,我不知道怎么办,这么关键的一步,我卡住了。

android laravel flutter mobile-application flutter-getx
© www.soinside.com 2019 - 2024. All rights reserved.