Как избежать использования BuildContext в асинхронных пробелах во Flutter?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как избежать использования BuildContext в асинхронных пробелах во Flutter?

Сообщение Anonymous »

Сейчас я прохожу стажировку по разработке мобильных приложений и работаю над приложением для микрофинансирования. В своем приложении я использую провайдеров для управления состоянием.
Я создал функцию входа в систему, но 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»