1. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

[Flutter] How to Avoid Using BuildContext in Async Gaps in Flutter?

Discussão em 'Mobile' iniciado por Stack, Outubro 1, 2024 às 02:23.

  1. Stack

    Stack Membro Participativo

    I am currently doing a mobile app development internship and working on a microfinance app. In my app, I am using Providers for state management.

    I created a login function, but Flutter gave me the warning: "Don't use BuildContext in async gaps."

    How can I resolve this issue and handle BuildContext correctly in asynchronous operations?

    Thanks in advance for your help!

    This is the method for loggin user in my provider

    class UserProvider extends ChangeNotifier {
    //Text Editing Controller

    final TextEditingController _userNameController = TextEditingController();
    final TextEditingController _passwordController = TextEditingController();

    //Getters For Text Eiting Controllers
    TextEditingController get userNameController => _userNameController;
    TextEditingController get passwordController => _passwordController;

    final DBController _dbController = DBController();
    final AuthController _authController = AuthController();
    final ApiController _apiController = ApiController();

    User? _loggedInUser;
    bool _isLoading = false;
    String? _errorMessage;

    // Cached
    List<String> _routesList = [];
    List<BranchModel> _branchesList = [];

    //Getter
    List<String> get routesList => _routesList;
    List<BranchModel> get branchesList => _branchesList;
    bool get isLoading => _isLoading;
    String? get errorMessage => _errorMessage;

    User? get loggedInUser => _loggedInUser;

    //Method to Login
    Future<bool> login({
    required String? branch,
    required BuildContext context,
    }) async {
    Logger().i("Login Method Called");

    Logger().i(
    "Username: ${userNameController.text}, Password: ${passwordController.text} Branch: $branch");
    _isLoading = true;
    _errorMessage = null;
    notifyListeners();

    // Show SpinKit loading dialog
    CustomDialog.showLoadingDialog(context);


    try {
    final response = await _apiController.loginUser(
    username: userNameController.text,
    password: passwordController.text,
    branch: branch);

    if (response['USER_ST'] == "1") {
    final List<dynamic> userDetails = response['USER_DET'];
    final List<dynamic> companyDetails = response['company'];

    if (userDetails.isNotEmpty && companyDetails.isNotEmpty) {
    //Save User Data
    for (var userJson in userDetails) {
    User user = User.fromJson(
    userJson, response['USER_ST'], companyDetails.first['code']);
    await _dbController.insertUser(user);
    }

    //Save Company Data
    for (var companyJson in companyDetails) {
    await _dbController.insertCompany(companyJson);
    }

    // Save session data in SharedPreferences
    final prefs = await SharedPreferences.getInstance();
    prefs.setString('USER_CODE', userDetails.first['code']);
    prefs.setString('USER_NAME', userDetails.first['user_name']);
    prefs.setString('BRANCH', userDetails.first['branch']);
    prefs.setString('IS_LOGIN', "1");

    _isLoading = false;
    notifyListeners();
    return true;
    } else {
    _errorMessage = "No user or company data found.";
    Logger().e(_errorMessage);
    }
    } else {
    _errorMessage = "Invalid username or password.";
    Logger().e(_errorMessage);
    CustomDialog.toast(context, "Invalid username or password.",textColor: AppColors.background,backgroundColor: AppColors.warningsRed);
    }
    } catch (e) {
    _errorMessage = "An error occurred: $e";
    Logger().e(_errorMessage);
    }

    // Hide SpinKit loading dialog if login fails
    CustomDialog.hideLoadingDialog(context);

    _isLoading = false;
    notifyListeners();
    return false;
    }
    }


    And this is the Method calling in my Login UI

    CustomButton(
    size: size,
    buttonName: "Sign In",
    icon: Icons.arrow_circle_right_outlined,
    colors: const [
    Color(0xFF007BFF),
    Color(0xFF007BFF)
    ],
    ontap: () {
    if (_formKey.currentState!.validate()) {
    // If all data are correct then save data to out variables
    _formKey.currentState!.save();
    // You can now call your provider or any API to submit the data
    if (mounted) {
    provider.login(
    branch: branchCode,
    context: context).then((success) {
    if (success) {
    // Navigate to the homepage if login is successful
    CustomNavigator.goWithDisableBack(context, Homepage());
    } else {
    // Show an error message if login failed
    Logger().i("Login failed");
    }
    },
    );
    }
    }
    },
    ),


    Can anyone help me to solve this?

    Continue reading...

Compartilhe esta Página