如何解决如何将notifyListeners方法传递给onPressed按钮函数?
我有一个LoginButtonProvider类,该类有两个目的。
首先:一旦用户在两个文本表单字段中都输入了内容,它将为我的LoginButton小部件提供onpressed方法。该类一旦为按钮分配了onpressed函数,就会调用notifyListeners()方法。
第二个:一旦用户按下该按钮并调用onpressed方法,它应该在该按钮内创建一个旋转的圆圈。一旦用户按下按钮,它也应该调用notifyListeners(),以便将布尔标志_isLoading设置为true。
问题在于,我不知道如何实现onpressed方法,以便一旦用户触发了onpressed方法,Consumer小部件即可自行重建。我认为,一旦用户按下按钮,就永远不会调用notifyListeners,因此旋转的圆圈永远不会出现在按钮上,但是应该! 我还尝试过将引用发送给notifyListeners方法。当在onpressed函数中调用notifyListeners()时,窗口小部件不会自行重建。这是为什么? 非常感谢您的帮助!
这是LoginButtonProvider类。
class LoginButtonProvider with ChangeNotifier {
Tokenviewmodel _tokenviewmodel = new Tokenviewmodel();
Function _onpressed;
bool _isLoading = false;
get onpressed => _onpressed;
get isLoading => _isLoading;
void updateButton(BuildContext context,FocusNode focusNode,Validator validator) {
if (!validator.areFieldsEmpty()) {
_onpressed = () {
if (validator.validateFields()) {
_isLoading = true;
notifyListeners();
_tokenviewmodel.getToken(validator.email,validator.password,context,focusNode);
_isLoading = false;
notifyListeners();
} else {
SimpleShowDialog.createSimpleShowDialog(
title: "Invalid Input",buttonText: "OK",context: context,message: validator.errorMessage,focusNode: focusNode,);
validator.reset();
}
};
notifyListeners();
} else {
_onpressed = null;
notifyListeners();
}
}
}
解决方法
我认为问题在于,从未调用此方法,因为onPressed
处理程序位于ChangeNotifier
内部。
这是所有错误的方法。不要在FocusNode
内部传递诸如context
,validator
,ChangeNotifier
之类的Widget逻辑实例,而是在按钮的onPressed
处理程序中进行所有验证然后使用Provider
在Notifier中调用该方法。
...
Widget build(BuildContext context){
final login = Provider.of<LoginButtonProvider>(context);
return login.isLoading?
Center(child: CircularProgressIndicator()):
Flatbutton(
child: Text('Login')
onPressed :
validator.areFieldsEmpty()) ? /// Now the button should not be clickbale,till the field is filled.
null:
() {
// do all your validation here
if (!validator.areFieldsEmpty()) {
login.updateButton(validator.email,validator.password);
} else {
SimpleShowDialog.createSimpleShowDialog(
title: "Invalid Input",buttonText: "OK",context: context,message: validator.errorMessage,focusNode: focusNode,);
validator.reset();
}
);
}
和LoginButtonProvider
,
class LoginButtonProvider with ChangeNotifier {
TokenViewModel _tokenViewModel = new TokenViewModel();
bool _isLoading = false;
get isLoading => _isLoading;
void updateButton(String email,String password)async {
_isLoading = true;
notifyListeners();
await _tokenViewModel.getToken(email,password); /// not sure what this is,but if its an API call would not recommend passing in context and node again,_isLoading = false;
notifyListeners();
}
请确保您在ChangeNotifierProvider<LoginButtonProvider>
上方有MaterialApp
,可以通过Provider
进行访问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。