背景
在有状态小部件的状态对象内,我有以下代码。
class _PendingJobsState extends State<PendingJobs> {
List<String> pendingJobs = []; <------------------- I am trying to change the state of this variable.
void updateListWithResponseData(List jobs) {
BackendApi.call(
endpoint: APIEndPoints.GET_PENDING_JOBS,
data: {"email": GlobalData.userEmail},
onSuccess: (data) {
setState(() { <---------------- I call set State here
jobs = data['job_list'];
print(pendingJobs); <------------ State is not changed
print(jobs);
});
},
onFailed: (error) {
print('Failed to fetch data!');
});
}
@override
void initState() {
updateListWithResponseData(pendingJobs); <------- This is where the function in which I call the setState is executed.
super.initState();
}
关于上述代码的详细信息
List<String> pendingJobs = [];
是我期望完成状态更改的变量。
在上面调用的变量正下方定义的函数updateListWithResponseData
采用 type 的参数List
。它还负责调用另一个名为BackendApi.call()
.
我正在调用udateListWithResponseData()
内部initState
,对于它所采用的类型参数List
,我给出了pendingJobs
我定义的变量。(因为我是setState
从updateListWithResponseData()
函数内部调用的,所以我期望调用时的状态pendingJobs
会发生变化updateListWithResponseData
。)
但是,我在上述观点中所期望的状态变化并没有发生。
BackendApi.call
负责从给定的 url 获取数据,它需要两个回调函数,onSuccess
它们onFailure
负责根据数据获取是否成功执行必要的操作。
重要说明
从 中删除List jobs
参数updateListWithResponseData
并直接引用pendingJobs
变量对我来说不是解决方案,因为我希望将调用的函数提取updateListWithResponseData
到单独的 dart 文件并从不同的小部件中调用它。所以我必须List jobs
在函数中有那个参数。
我尝试调试此问题一段时间,但找不到解决方案。如果有人能指出为什么状态pendingJobs
没有改变以及如何真正改变它,那将非常有帮助。(谢谢。)
**编辑**
由于下面的很多评论似乎都围绕着该BackendApi.call()
函数,并且由于我没有在我的原始帖子中包含该函数的代码,因此我编辑了这篇文章以包含该函数的代码。
import 'dart:convert';
import 'package:field_app/globalData/global_data.dart';
import 'package:http/http.dart' as http;
import 'api_endpoints.dart';
typedef ValueChanged<T> = void Function(T value);
class BackendApi {
static void call(
{String endpoint,
Map<String, dynamic> data,
ValueChanged<Map<String, dynamic>> onSuccess,
ValueChanged<String> onFailed}) async {
try {
var response = await http.post(APIEndPoints.API_ROOT + endpoint,
headers: {
"Content-Type": "application/json",
"Authorization": 'Bearer ' + GlobalData.authToken,
},
body: jsonEncode(data));
Map<String, dynamic> apiResponse = jsonDecode(response.body);
if (apiResponse != null) {
if (response.statusCode == 200) {
if (onFailed != null) {
onSuccess(apiResponse);
}
} else {
print(apiResponse['message']);
print('code: ' + response.statusCode.toString());
if (onFailed != null) {
onFailed(apiResponse['message']);
}
}
} else {
print('Invalid API response format');
print('code: ' + response.statusCode.toString());
return null;
}
} catch (e) {
print("Failed to connect with backend API");
print(e.toString());
return null;
}
}
}