我正在嘗試比較兩個物件并查看它們是否具有相同的值,其中一個物件來自未來的 api 呼叫
ProjectModel response = await ProjectServices.fetchSingleProjectStream(
projectId: projectId,
);
另一個來自我呼叫onInit()的另一個 api 呼叫填充的本地值
final _projectModel = ProjectModel(
guid: '',
projectColor: '',
title: '',
tags: [],
tasks: [],
teamMembers: [],
).obs;
fetchSingleProject() async {
try {
if (_projectModel.value.tasks!.isEmpty) {
_isLoading(true);
}
ProjectModel response = await ProjectServices.fetchSingleProjectStream(
projectId: projectId,
);
print('from local: ${_projectModel.value.tasks![0].description}');
print('from api: ${response.tasks![0].description}');
// var shouldReload = projectModel.tasks!
// .any((element) => _projectModel.value.tasks!.contains(element));
// bool shouldReload = response.tasks == _projectModel.value.tasks;
const DeepCollectionEquality dc = DeepCollectionEquality.unordered();
bool shouldReload = dc.equals(
response.tags!.toList(),
_tagsList.toList(),
);
print('should the stream reload: $shouldReload');
if (shouldReload) {
_projectModel.value = response;
_tagsList.assignAll(response.tags!);
}
} catch (e) {
throw Get.snackbar('Opss', 'An error occourred');
} finally {
_isLoading(false);
}
}
fetchInitialProject() async {
try {
_isLoading(true);
ProjectModel response = await ProjectServices.fetchSingleProjectStream(
projectId: projectId,
);
_projectModel.value = response;
_tagsList.assignAll(response.tags!);
} catch (e) {
throw Get.snackbar('Error', '$e');
} finally {
_isLoading(false);
}
}
@override
Future<void> onInit() async {
if (_projectModel.value.tasks!.isEmpty) await fetchInitialProject();
super.onInit();
}
@override
void onReady() {
timer = Timer.periodic(const Duration(seconds: 3), (timer) async {
await fetchSingleProject();
});
super.onReady();
}
當我列印每個物件的值時,它們的結果相同,但結果卻是錯誤的,為什么會這樣,我該如何解決?
print('from local: ${_projectModel.value.tasks![0].description}');
print('from api: ${response.tasks![0].description}');
---
flutter: from local: This is an autogenerated #tbd, @ShemsedinRaketa
flutter: from api: This is an autogenerated #tbd, @ShemsedinRaketa
---
嘗試比較tasksList的方法 1 :
bool shouldReload = response.tasks == _projectModel.value.tasks;
// returns false
嘗試比較tasksList的方法 2 :
// importing form the collection package
const DeepCollectionEquality dc = DeepCollectionEquality.unordered();
bool shouldReload = dc.equals(
response.tags!.toList(),
_tagsList.toList(),
);
// returns false as well
嘗試比較tasksList的方法 3 :
var shouldReload = projectModel.tasks!
.any((element) => _projectModel.value.tasks!.contains(element));
// even if all the values are not the same it still returns true when
// only one of the values matches
// flutter: from local: This is an autogenerated #tbd,
// @ShemsedinRaketa
// flutter: from api: This is an autogenerated #tbd, @ShemsedinRaketa poakdhmnbs
// flutter: should the stream reload: true
我想要實作的是一個流,我希望能夠控制何時加載來自 api 的新資料,何時不加載,即來自 api 的資料與本地然后不要更新用戶界面。
uj5u.com熱心網友回復:
bool areEqual(List<Person> a, List<Person> b){
for(int i = 0;i<a.length;i ){
if(a[i].id != b[i].id){
return false;
}
}
return true;
}
void main(){
List<Person> a = [Person(),Person()];
List<Person> b = [Person(),Person()];
}
這就是您的函式的樣子,但是將其更改為您的 Objects 而不是 Person 并且 value 不是 id,而是為您描述
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483564.html
下一篇:可選添加到物件的簡單表示法?
