从.txt文件中搜索超过5000个实体的搜索引擎



我有超过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作为未来,你将在你的应用程序中使用。

相关内容

  • 没有找到相关文章

最新更新