我已经按照第一次按下后禁用颤动提升按钮的示例进行操作,但速度不够快。我的 onPressed 的一部分会调用后端服务器来获取数据,但这是一个漫长的过程,在此期间按钮保持启用状态的时间比我希望的要长,并且有可能可以再次按下它。如何让按钮在按下时立即禁用,而不等待状态或数据返回?
bool isClicked = false;
ElevatedButton(
onPressed:
isClicked ? null :
() async {
setState(() {
isClicked = true;
});
await postData();
//postData makes a backend http.post call to a webserver for json data
)
这个想法是按下按钮后不执行任何操作,此时正在从其他外部源发送或接收数据。
看下面的例子:
class Home extends StatefulWidget {
const Home ({super.key});
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
bool isPressed = false;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
'Don\'t wait for sever response',
),
SizedBox(
height: 20,
),
ElevatedButton(
child: Text('Pressed : $isPressed '),
onPressed: ()async{
if(isPressed){
return;
}
else{
setState((){
isPressed = !isPressed;
});
print(await getData());
}
},
),
SizedBox(height : 20),
if(isPressed)
FutureBuilder(
future: getData(),
builder: (context,snapshot){
if(snapshot.hasData){
return Text('Got Data : ${snapshot.data}');
}
else if(snapshot.hasError){
return Text('error');
}
else{
return CircularProgressIndicator();
}
}
)
],
),
);
}
}
Future<int> getData()async{
return await Future.delayed(Duration(seconds: 3,), ()=>15);
}
一旦单击按钮,onPressed 函数不会执行任何操作,此时系统会等待传入的数据。但用户可以在我等待时发起另一个请求。
btw:最好处理逻辑分离,状态管理器可以为您调用
PostData
方法(不要在 onPressed
中调用它),以免被迫将 onPressed
标记为 async
。一切都有效,但这是一个偏好。
希望对您有帮助。