Future<List<Books>>与Future<List<Future<Books>>>差异及函数修改方案
Future<List> 与 Future<List<Future>> 的差异及函数修改方案
两者核心差异
- Future<List
> :异步操作完成后直接返回已解析完成的Books对象列表,await后可直接使用列表中的实体对象,无需额外处理异步逻辑。 - Future<List<Future
>> :异步操作完成后返回的列表中每个元素仍是未完成的异步任务,需要对列表内每个元素单独await才能获取实际的Books对象,增加了代码复杂度和出错概率。
修改searchBook函数的实现方案
当前代码中,appDb.books.mapFromRow返回的是Future<Books>,导致map后的结果为List<Future<Books>>,最终函数返回Future<List<Future<Books>>>。可通过Future.wait()等待所有异步任务完成来修正返回类型:
Future<List<Books>> searchBook(String searchString) async { // 获取包含异步任务的列表 final bookFutures = appDb.customSelect( 'SELECT * FROM books', readsFrom: {appDb.books}, ).map(appDb.books.mapFromRow).get(); // 等待所有异步任务完成,返回已解析的Books列表 return await Future.wait(bookFutures); }
补充说明
如果mapFromRow方法可以修改为同步返回Books(而非Future<Books>),则代码可简化为:
Future<List<Books>> searchBook(String searchString) async { return await appDb.customSelect( 'SELECT * FROM books', readsFrom: {appDb.books}, ).map(appDb.books.mapFromRow).get(); }
但根据当前函数的返回类型推断,mapFromRow应为异步方法,因此优先采用Future.wait()的方案。
内容的提问来源于stack exchange,提问作者user33629
相关产品推荐
相关产品推荐

