描述
執行提供程式時的錯誤ref.read
或ref.watch
結果相同,它卡在加載塊上,而在郵遞員中測驗api作業正常,有趣的是api呼叫被執行并且每當我在它里面列印一些東西時出現在控制臺中
在表示層重現
onpressed:()=>ref
.read(getPatientProvider(
r.api_token))
.when(data: (data) {
data.fold(
(l) => print(
"something wrong happened"),
(r) async {
print(r.id);
print("hello");
patient.value = patient.value
.copyWith(
name: r.name,
aliid: r.id,
appointments: r
.patient_appointments,
fcmtoken: token);
ref.read(docexist(r.id)).when(
loading: () =>
print("loading"),
error: (error, _) =>
print(error),
data: (data) async {
print("heloo");
if (data.isEmpty) {
print(
"data is not empty");
} else {
return print(
"logged in normally");
}
});
});
}, error: (error, _) {
print(error);
}, loading: () {
print("object");
})
提供 Riverpod 發電機的供應商
@riverpod
Future<Either<ApiFailures, dynamic>> getPatient(
GetPatientRef ref, String token) async {
final patientProvider = ref.watch(patientRepositoryProvider);
return patientProvider.getInfo(token);
}
基礎設施層
@override
Future<Either<ApiFailures, dynamic>> getInfo(String token) {
var dio = Dio();
final result = TaskEither<ApiFailures, PatientModel>(() async {
try {
final response = await dio.get(
"https://xxxxxxxx/GetInfo?api_token=$token");
if (response.data == null) {
return const Left(ApiFailures.notfound());
} else {
PatientModel patientModel =
PatientModel.fromJson(response.data["User"]);
return Right(patientModel);
}
} catch (err, st) {
final message = 'error ${err.runtimeType}]';
if (kDebugMode) log(message, error: err, stackTrace: st);
if (err is DioError) {
return Left(ApiFailures.fromDioError(error: err));
}
return const Left(ApiFailures.internalError());
}
});
return result.map((r) => r).run();
}
預期的行為 它應該像往常一樣獲取資料
uj5u.com熱心網友回復:
在諸如您所做的單擊處理程式中呼叫“何時”onPressed
是沒有意義的。
“何時”不等待未來完成。它根據未來的當前狀態立即執行。
考慮到你呼叫的時候只是觸發了future,那么那個時候的future會一直處于loading狀態。
你想要的是像 async/await 這樣的東西,你可以等到你的未來完成。
你可以這樣做:
onPressed: () async {
final value = await ref.read(provider.future);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/529418.html
標籤:扑镖河荚扑钩