我有超过5000个。txt文件本地存储在我的应用程序中,每个文件至少有15行单词所以我试图在5000个列表中搜索多个单词最后,我能够搜索所有的,但只有一个问题应用程序冻结,直到整个过程完成
Future<List<FatwaModel>> searchFatawy(String searchText) async {
if (searchText.isEmpty) return [];
emit(SearchFatawyLoadingState());
searchFatawyTxt.clear();
RegExp regExp = RegExp(
RemoveExtinctionsAtWord()
.normalise(searchText)
.trim()
.split(' ')
.where((element) => element.length > 1)
.join('|'),
caseSensitive: false,
);
Future.forEach(fullFatawy, (FatwaModel fatwa) {
bool check = regExp.hasMatch(RemoveExtinctionsAtWord().normalise(
RegExp(r'(?<=:)(.*)(?=)').firstMatch(fatwa.fatwaBody)?.group(0) ?? '',
));
if (check) searchFatawyTxt.add(fatwa);
}).then((value) {
emit(SearchFatawySuccessState());
});
// searchFatawyTxt = fullFatawy
// .where((fatwa) => regExp.hasMatch(RemoveExtinctionsAtWord().normalise(
// RegExp(r'(?<=:)(.*)(?=)').firstMatch(fatwa.fatwaBody)?.group(0) ??
// '',
// )))
// .toList();
//Sorting the list depending on how many keywords found in a single txt file
searchFatawyTxt.sort(
(FatwaModel a, FatwaModel b) {
int aMatchCount = regExp
.allMatches(
RemoveExtinctionsAtWord().normalise(
RegExp(r'(?<=:)(.*)(?=)').firstMatch(a.fatwaBody)?.group(0) ??
'',
),
)
.length;
int bMatchCount = regExp
.allMatches(
RemoveExtinctionsAtWord().normalise(
RegExp(r'(?<=:)(.*)(?=)').firstMatch(b.fatwaBody)?.group(0) ??
'',
),
)
.length;
return bMatchCount.compareTo(aMatchCount);
},
);
return searchFatawyTxt;
}
所有我想做的是显示一个进度条,而搜索正在进行过程中没有冻结应用程序。
你需要在另一个不与主线程共享内存的隔离中调用它,而不是直接在你的应用程序(在主线程上)调用该方法。
最快和最简单的方法是调用compute()
方法,该方法生成一个隔离,并在该隔离上运行提供的回调,将提供的消息传递给它,并(最终)返回回调返回的值。
Future<List<FatwaModel>> isolatedMethod = compute(searchFatawy, searchText);
注意,我正在传递你的方法声明,而不是在compute()
中调用它。
现在你可以使用isolatedMethod
作为未来,你将在你的应用程序中使用。