Flutter : 隔离 Future<Either> 的右手边
Flutter : isolate the right hand of Future<Either>
我将 riverpod 与 dartz 一起使用,但我面临一个问题,即当我将未来的提供者与我的功能一起使用时,我也无法掌握这两者,我如何才能将我想要从该功能中检索的内容隔离开来错误处理 !
我的提供商代码:
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<Either<ApiFailures, List<CourseModel>>>' isn't a 'Future<List<CourseModel>>', as required by the closure's context.
这是因为您声明该函数将 return 一个结果:
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
}
您的提供商 activeCourseProvider
似乎应该 return List<CourseModel>
,而不是 Either<ApiFailures, List<CourseModel>>
。
您可以使用 fold
和 Either
值,如下所示:
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
);
});
但是,您可能还希望让您的提供商 return 使用 Either<ApiFailures, List<CourseModel>>
值而不是 List<CourseModel>
。如果您想在表示层中进一步处理 ApiFailures
,这可能很有用。这取决于您的架构。
我将 riverpod 与 dartz 一起使用,但我面临一个问题,即当我将未来的提供者与我的功能一起使用时,我也无法掌握这两者,我如何才能将我想要从该功能中检索的内容隔离开来错误处理 !
我的提供商代码:
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<Either<ApiFailures, List<CourseModel>>>' isn't a 'Future<List<CourseModel>>', as required by the closure's context.
这是因为您声明该函数将 return 一个结果:
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
}
您的提供商 activeCourseProvider
似乎应该 return List<CourseModel>
,而不是 Either<ApiFailures, List<CourseModel>>
。
您可以使用 fold
和 Either
值,如下所示:
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
);
});
但是,您可能还希望让您的提供商 return 使用 Either<ApiFailures, List<CourseModel>>
值而不是 List<CourseModel>
。如果您想在表示层中进一步处理 ApiFailures
,这可能很有用。这取决于您的架构。