【问题标题】:Flutter : isolate the right hand of Future<Either>Flutter : 隔离 Future<Either> 的右手
【发布时间】:2021-10-22 18:02:40
【问题描述】:

iam 将 Riverpod 与 dartz 一起使用,nad iam 面临一个问题,即在将未来的提供程序与我的函数一起使用时,我也无法使用其中的任何一个,我怎样才能将我想要从函数中检索到的内容与错误隔离开来处理!

我的供应商代码:

final activeCourseProvider =
    FutureProvider.autoDispose.family<List<CourseModel>, int>((ref, yearId) {
  final _courseRepository = ref.watch(coursesRepositoryProvider);
  return _courseRepository.activeCourses(yearId);
});

我的功能代码:

Future<Either<ApiFailures, List<CourseModel>>> activeCourses(int yearId) async {
   try{ final response = await http.post(
        Uri.parse("http://msc-mu.com/api_verfication.php"),
        body: {"flag": "selectcourses", "year": "$yearId"});
if (response.statusCode == 200) {
        var l = json.decode(response.body) as List<dynamic>;
        var courses = l.map((e) => CourseModel.fromJson(e)).toList();
        return right(courses);
      } else {
        return left(ApiFailures.notFound());
      }
    } on SocketException {
      return left(ApiFailures.noConnection());
    } on HttpException {
      return left(ApiFailures.notFound());
    }
  }

弹出的错误是:The return type 'Future&lt;Either&lt;ApiFailures, List&lt;CourseModel&gt;&gt;&gt;' isn't a 'Future&lt;List&lt;CourseModel&gt;&gt;', as required by the closure's context.

【问题讨论】:

  • final activeCourseProvider = FutureProvider.autoDispose.family, int>
  • @croxx5f 那行不通!

标签: flutter dart riverpod dartz


【解决方案1】:

您的 Provider activeCourseProvider 似乎应该返回 List&lt;CourseModel&gt;,而不是 Either&lt;ApiFailures, List&lt;CourseModel&gt;&gt;

您可以使用foldEither 值,如下所示:

final activeCourseProvider = FutureProvider.autoDispose.family<List<CourseModel>, int>((ref, yearId) {
  final _courseRepository = ref.watch(coursesRepositoryProvider);
  return _courseRepository.fold<List<CourseModel>>(
    (ApiFailures failure) => {
      // Handle failure
      return [];
    },
    (List<CourseModel> r) => r
  );
});

但是,您可能还希望您的 Provider 返回一个 Either&lt;ApiFailures, List&lt;CourseModel&gt;&gt; 值而不是 List&lt;CourseModel&gt;。如果您想在表示层中进一步处理ApiFailures,这可能会很有用。这取决于您的架构。

【讨论】:

  • 我已经处理了我的表示层的故障,非常感谢 thierry
【解决方案2】:

这是因为您声明该函数将返回 Either 结果:

Future<Either<ApiFailures, List<CourseModel>>>

但是当你传递类型时:

FutureProvider.autoDispose.family<List<CourseModel>

其中一个没有被处理,改变这个:

return _courseRepository.activeCourses(yearId);

final result= _courseRepository.activeCourses(yearId);
if(result.isRight()){
return result.gerOrElse(()=>null);
}else{
///handle left result
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2012-12-19
    • 2016-01-23
    • 1970-01-01
    • 2015-01-05
    • 2021-01-18
    • 2015-12-28
    相关资源
    最近更新 更多