Я создал функцию входа в систему, но Flutter предупредил меня:
"Не используйте BuildContext в асинхронных пробелах. "
Как я могу решить эту проблему и правильно обрабатывать BuildContext в асинхронных операциях?
Заранее спасибо за помощь!
Это метод входа пользователя в мой провайдер
Код: Выделить всё
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 _routesList = [];
List
_branchesList = [];
//Getter
List get routesList => _routesList;
List
get branchesList => _branchesList;
bool get isLoading => _isLoading;
String? get errorMessage => _errorMessage;
User? get loggedInUser => _loggedInUser;
//Method to Login
Future 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 userDetails = response['USER_DET'];
final List 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;
}
}
Код: Выделить всё
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");
}
},
);
}
}
},
),
Подробнее здесь: https://stackoverflow.com/questions/790 ... in-flutter
Мобильная версия