禁用 Flutter ElevatedButton 速度不够快

问题描述 投票:0回答:1

我已经按照第一次按下后禁用颤动提升按钮的示例进行操作,但速度不够快。我的 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

)
flutter setstate
1个回答
0
投票

这个想法是按下按钮后不执行任何操作,此时正在从其他外部源发送或接收数据。

看下面的例子:

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
。一切都有效,但这是一个偏好。

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.