我正在嘗試將提供程式與異步函式一起使用,在該函式中我正在更改變數的值,并且一旦值發生更改,我希望所有偵聽器都得到通知。
我正在發送一個發布請求并在下面的異步函式中等待回應。我正在等待回應,并取決于我想在 Stateful Widget 上顯示訊息。
提供者似乎改變了變數的值,但沒有改變Text螢屏上的狀態。
userloginprovider.dart
bool isLoading = false;
HttpService http = HttpService();
class UserLoginProvider with ChangeNotifier {
String loginMessage = '';
late UserAuthorizationResponse userRegistrationResponse;
Future loginUser(userData) async {
Response response;
print(loginMessage);
try {
isLoading = true;
response = await http.loginUser('api/v1/login/', userData);
isLoading = false;
if (response.statusCode == 200) {
var newReponse = response.data;
userRegistrationResponse =
UserAuthorizationResponse.fromJson(newReponse['data']);
loginMessage = newReponse['message'];
} else {
print('status code is not 200.');
}
} on Exception catch (e) {
isLoading = false;
loginMessage = e.toString().substring(11);
}
notifyListeners();
}
}
userloginscreen.dart
class _LoginPageState extends State<LoginPage> {
final UserLoginProvider userLoginProvider = UserLoginProvider();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: ChangeNotifierProvider(
create: (context) => UserLoginProvider(),
child: Consumer<UserLoginProvider>(
builder: (context, provider, child) {
return Container(
padding: const EdgeInsets.all(8.0),
width: double.infinity,
height: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(provider.loginMessage.toString()), //<-- I want to change value here.
AuthorizationButtons(
fieldName: 'Username',
textEditingController: usernameController,
),
AuthorizationButtons(
fieldName: 'Password',
textEditingController: passwordController,
),
OutlinedButton(
onPressed: () {
userData = {
'username': usernameController.text,
'password': passwordController.text,
};
userLoginProvider.loginUser(userData);
},
child: const Text('Submit'),
)
],
),
);
},
),
),
);
}
}
uj5u.com熱心網友回復:
每次重建都會創建一個新的提供者
body: ChangeNotifierProvider(
create: (context) => UserLoginProvider(),
使用狀態中的那個
body: ChangeNotifierProvider(
create: (context) => userLoginProvider,
uj5u.com熱心網友回復:
您在 catch 塊中失敗時通知偵聽器:-
on Exception catch (e) {
isLoading = false;
loginMessage = e.toString().substring(11); //here
notifyListeners();
}
}
但是如果代碼運行沒有錯誤(例外)。你沒有在你的代碼上通知它。所以,如果你想通知,試試這樣的
try {
isLoading = true;
response = await http.loginUser('api/v1/login/', userData);
isLoading = false;
if (response.statusCode == 200) {
var newReponse = response.data;
userRegistrationResponse =
UserAuthorizationResponse.fromJson(newReponse['data']);
loginMessage = 'something'; //here
} else {
print('status code is not 200.');
}
notifyListeners();//notify the listeners here
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497920.html
上一篇:E/flutter(6339):[錯誤:flutter/lib/ui/ui_dart_state.cc(198)]未處理的例外:型別'TextEditingController'不
