flutter - 使用切换按钮时显示微调器
问题描述
我正在使用这个包来创建一个切换按钮。当开关以任一方式切换时,会弹出一个对话框,当有人在弹出的对话框上按确定时,一些数据会保存在数据库中,然后开关翻转。以下代码存在此问题。
- 切换开关按钮时,在将值保存到 DB 之前,开关不会翻转。这会给用户造成一种错觉,即可能切换不起作用。我该如何处理这种情况,以便用户看到加载微调器来通知他们正在处理他们请求的更改?
这是代码:
SwitcherButton(
key: UniqueKey(),
value: isSwitchOn,
onColor: Colors.greenAccent,
offColor: Colors.grey,
onChange: (value) {
print(value);
AwesomeDialog(
context: context,
dialogType: DialogType.QUESTION,
animType: AnimType.TOPSLIDE,
title: isSwitchOn
? 'Mark item as unavailable ?'
: 'Mark item as available?',
desc: '',
btnCancelOnPress: () {
setState(() {
// isSwitchOn=!value;
print(
'Value after cancel is ' + isSwitchOn.toString());
});
},
btnOkText: "Yes",
btnCancelText: "No",
btnOkOnPress: () {
setState(() {
isSwitchOn = !isSwitchOn;
updateProductAvailability(isSwitchOn);
});
},
)..show();
},
),
updateProductAvailability(bool isSwitchOn) async {
await Provider.of<Products>(context, listen: false)
.updateProductAvailability(widget.id, isSwitchOn)
.then((value) => Scaffold.of(context).showSnackBar(
SnackBar(
content: isSwitchOn
? Text('Product marked as available')
: Text('Product marked as unavailable'),
duration: Duration(seconds: 2),
),
)).catchError((Object error){
Scaffold.of(context).showSnackBar(
SnackBar(
content:Text('Something went wrong. Please try again later.'),
duration: Duration(seconds: 2),
),
);
});
}
根据尼克的回复更新了答案。
_isLoading?CircularProgressIndicator():SwitcherButton(
key: UniqueKey(),
value: isSwitchOn,
onColor: Colors.greenAccent,
offColor: Colors.grey,
onChange: (value) {
value=!value;
AwesomeDialog(
context: context,
dialogType: DialogType.QUESTION,
animType: AnimType.TOPSLIDE,
title: isSwitchOn
? 'Mark item as unavailable ?'
: 'Mark item as available?',
desc: '',
btnCancelOnPress: () {
setState(() {
// isSwitchOn=!value;
print(
'Value after cancel is ' + isSwitchOn.toString());
});
},
btnOkText: "Yes",
btnCancelText: "No",
btnOkOnPress: () {
setState(() {
isSwitchOn = !isSwitchOn;
//print('isswitchon value is ' + isSwitchOn.toString());
updateProductAvailability(isSwitchOn);
});
},
)..show();
},
),
updateProductAvailability(bool isSwitchOn) async {
setState((){
_isLoading = true;
});
await Provider.of<Products>(context, listen: false)
.updateProductAvailability(widget.id, isSwitchOn)
.then((value) {
// <---------------------------
setState((){
_isLoading = false;
});
Scaffold.of(context).showSnackBar(
SnackBar(
content: isSwitchOn
? Text('Product marked as available')
: Text('Product marked as unavailable'),
duration: Duration(seconds: 2),
),
);}).catchError((Object error){
// <---------------------------
setState((){
_isLoading = false;
});
Scaffold.of(context).showSnackBar(
SnackBar(
content:Text('Something went wrong. Please try again later.'),
duration: Duration(seconds: 2),
),
);
});
}
解决方案
未来需要一些时间才能完成。
使用变量来isLoading
维护加载逻辑会有所帮助。下面是例子。
在 State Class 中定义一个变量 isLoading。
bool isLoading = false;
现在在您的小部件树中根据需要使用它。
isLoading ? AnySpinnerWidget() : ShowAlternativeWidget()
setState
根据并调用更新 UI 将其标记为 true 和 false 。
updateProductAvailability(bool isSwitchOn) async {
// <---------------------------
setState((){
isLoading = true;
});
await Provider.of<Products>(context, listen: false)
.updateProductAvailability(widget.id, isSwitchOn)
.then((value) {
// <---------------------------
setState((){
isLoading = false;
});
Scaffold.of(context).showSnackBar(
SnackBar(
content: isSwitchOn
? Text('Product marked as available')
: Text('Product marked as unavailable'),
duration: Duration(seconds: 2),
),
)}).catchError((Object error){
// <---------------------------
setState((){
isLoading = false;
});
Scaffold.of(context).showSnackBar(
SnackBar(
content:Text('Something went wrong. Please try again later.'),
duration: Duration(seconds: 2),
),
);
});
}
推荐阅读
- python - 为什么我安装的包没有被识别
- reactjs - TypeError:App_1.apiUrl 不是函数
- python - 多张图像的边缘检测
- spring-boot - 如何告诉 docker run 从 docker hub 运行最新的图像?
- kubernetes - 如何使用一些默认模式和数据在 kubernetes 上部署 MariaDB?
- ruby-on-rails - 运行 'react-script start' 得到 400 错误请求
- gitlab-ci - 如何将 gitlab-ci.yml 文件格式化为 HTML
- python-3.x - 如何散列密码以用于 HttpNtlmAuth
- php - Laravel 雄辩与查询构建器的优缺点
- c# - 如何从其他页面初始化 ShellView(Windows 模板工作室)