我的 flutter 應用程式中有一個有狀態的小部件有問題,它有一個接受按鈕來發出 http 請求。我希望它能夠在按下按鈕時禁用該按鈕,直到 http 請求完成,但在請求之前設定狀態時它似乎不起作用。
我在下面制作了一個帶有虛擬請求方法的演示來模擬正在發生的事情。當按鈕被按下時,它不會被禁用,直到對 _acceptRequest 的呼叫完成之后。我的期望是在此之前禁用它,因為之前呼叫了 set state。
這里有一些這樣的例子,但它對我不起作用,我似乎在做與那些帖子中建議的相同的事情。
import 'package:flutter/material.dart';
import 'dart:io';
class StatefulButtonDisable extends StatefulWidget {
const StatefulButtonDisable({ Key? key }) : super(key: key);
@override
_StatefulButtonDisableState createState() => _StatefulButtonDisableState();
}
class _StatefulButtonDisableState extends State<StatefulButtonDisable> {
bool _enableButton = true;
@override
Widget build(BuildContext context) {
Future<bool> _acceptRequest(id) async {
print('accpeting request $id');
sleep(Duration(seconds: 5));
return true;
}
_sendRequest(id) async {
setState(() {
_enableButton = false;
});
await _acceptRequest(id);
}
return Scaffold(
appBar: AppBar(
title: Text('Disable Button'),
),
body: Container(
child: ElevatedButton(
onPressed: _enableButton
? () { _sendRequest(7); }
: null,
child: Text('Press Me'),),
),
);
}
}
uj5u.com熱心網友回復:
Future<bool> _acceptRequest(id) async {
print('accpeting request $id');
sleep(Duration(seconds: 5));
return true;
}
我知道它回傳一個 future 并且您已將其標記為async,但這實際上不是一個異步函式。它不會異步執行任何操作。它不使用await關鍵字。sleep 函式將完全阻塞當前執行緒,不提問,不俘虜。
該檔案的睡眠說
小心使用它,因為當它在睡眠呼叫中被阻塞時,不能在隔離中處理異步操作。
如果你想讓你的應用程式正常作業,標記的方法async應該使用符合async/await模型的等待方式,例如Future.delayed:
Future<bool> _acceptRequest(id) async {
print('accpeting request $id');
await Future.delayed(Duration(seconds: 5));
return true;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/335002.html
