在實作了一個簡單的riverpod庫來發送請求并從服務器獲取回應之后,當我嘗試使用它時useEffect,我得到了這個錯誤:
Error: A value of type 'Future<NetworkRequestState<Posts>>'
can't be returned from a function with return type 'void Function()?'.
Riverpod 存盤庫實作:
final getPostProvider = Provider((ref) => PostRepository(ref.read));
final postProvider =
StateNotifierProvider<PostNotifier, NetworkRequestState<Posts>>(
(ref) => PostNotifier(
ref.watch(getPostProvider),
),
);
class PostRepository {
final Reader _reader;
PostRepository(this._reader);
Future<Posts> requestGetPosts() async {
try {
const r = RetryOptions(maxAttempts: 3);
final response = await r.retry(
() => _reader(dioProvider)
.get(Server.$posts,
options: Options(
headers: {'Content-Type': 'application/json'},
))
.timeout(const Duration(seconds: 30)),
retryIf: (e) => e is SocketException || e is TimeoutException,
);
return Posts.fromJson(response.data as Map<String, dynamic>);
} on DioError catch (e) {
throw e.error as Object;
}
}
}
class PostNotifier extends RequestStateNotifier<Posts> {
final PostRepository _postRepository;
PostNotifier(this._postRepository);
Future<NetworkRequestState<Posts>> getPosts() =>
makeRequest(() =>
_postRepository.requestGetPosts());
}
和HookWidget類:
class Home extends HookWidget {
@override
Widget build(BuildContext context) {
useEffect(() => useProvider(postProvider.notifier).getPosts());
//...
}
完整錯誤:
lib/src/home/home.dart:20:56: Error: A value of type 'Future<NetworkRequestState<Posts>>' can't be returned from a function with return type 'void Function()?'.
- 'Future' is from 'dart:async'.
- 'NetworkRequestState' is from 'package:xxxxxxxxxx/service/freezed/network_request_state.dart' ('lib/service/freezed/network_request_state.dart').
- 'Posts' is from 'package:xxxxxxxxxx/src/home/model/posts.dart' ('lib/src/home/model/posts.dart').
useEffect(() => useProvider(postProvider.notifier).getPosts());
^
uj5u.com熱心網友回復:
useProvider不回傳 avoid Function()?并useEffect期望 avoid Function()?被回傳。
做這個:
useEffect((){
useProvider(postProvider.notifier).getPosts();
return (){};
});
或者您可以選擇不回傳任何東西,如下所示:
useEffect((){
useProvider(postProvider.notifier).getPosts();
});
注意:考慮遷移到新版本的hooks_riverpodasuseProvider已被棄用。
修復:無法監聽 HookState.initState 中繼承的小部件。改用 HookState.build
既然useProvider是鉤子,你不必把它放進去useEffect
做就是了:
Widget build(BuildContext context) {
useProvider(postProvider.notifier).getPosts();
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471864.html
上一篇:未處理的例外:FormatException:在顫振(在shared_preferences中)中輸入意外結束(在字符1處)
下一篇:顫動中具有相互類名的Web報廢表
