現状
Github Search Repository APIを使いFutureProviderでGithubのリポジトリデータを
取得してListViewに表示させる処理を動画を参考に書きました。
状態管理はriverpodを使用しておりMVVMで作成しております。
また、freezedでJSONクラスを作成しています。
Dart
1 2class RepositoryData with _$RepositoryData { 3 const factory RepositoryData({ 4 required int total_count, 5 required List<RepositoryDataItems> items, 6 }) = _RepositoryData; 7 8 factory RepositoryData.fromJson(Map<String, dynamic> json) => 9 _$RepositoryDataFromJson(json); 10} 11 12 13class RepositoryDataItems with _$RepositoryDataItems { 14 const factory RepositoryDataItems({ 15 required String full_name, 16 required RepositoryDataOwner owner, 17 required String? description, 18 required int stargazers_count, 19 required int watchers_count, 20 required String? language, 21 required int forks_count, 22 required int open_issues_count, 23 }) = _RepositoryDataItems; 24 25 factory RepositoryDataItems.fromJson(Map<String, dynamic> json) => 26 _$RepositoryDataItemsFromJson(json); 27} 28 29 30class RepositoryDataOwner with _$RepositoryDataOwner { 31 const factory RepositoryDataOwner({ 32 required String avatar_url, 33 }) = _RepositoryDataOwner; 34 35 factory RepositoryDataOwner.fromJson(Map<String, dynamic> json) => 36 _$RepositoryDataOwnerFromJson(json); 37}
やりたいこと
RepositoryDataItems以下のデータを遷移先のページで表示したいです。
ViewページのNavigatorにdata.items[index].full_name のように表示できる処理を書いているため
引数にベタ書きすることも可能ですが、riverpodを利用して実現できるのが理想なため
RepositoryDataItems のdata.items[index]までのデータを引数に指定して渡しています。
問題点
VMではRepositoryDataItems型のStateProviderで受け取っています。
(APIを取得する処理は省略しております。)
Dart
1import 'package:flutter_riverpod/flutter_riverpod.dart'; 2 3import 'data/repository_data.dart'; 4import 'main_logic.dart'; 5 6StateProvider<RepositoryDataItems> _navigationIndexProvider = 7 StateProvider<RepositoryDataItems>((ref) => 8 const RepositoryDataItems( 9 full_name: "", 10 description: "", 11 stargazers_count: 0, 12 watchers_count: 0, 13 language: "", 14 forks_count: 0, 15 open_issues_count: 0, 16 owner: RepositoryDataOwner(avatar_url: ""), 17 ), 18); 19 20class MainPageVM { 21 late final WidgetRef _ref; 22 RepositoryDataItems get tappedRepository =>_ref.watch(_navigationIndexProvider); 23 24 void setRef(WidgetRef ref) { 25 _ref = ref; 26 } 27 28 29 // onTapで選択されたリストのindexを返す 30 void onListTapped(RepositoryDataItems repositoryData) { 31 _ref.read(_navigationIndexProvider.notifier).update((state) => repositoryData); 32 } 33} 34
ですが遷移先のページで以下のように受け取ると
LateError (LateInitializationError: Field '_ref@29499364' has not been initialized.) と表示されます。
Dart
1final MainPageVM _vm = MainPageVM(); 2RepositoryDataItems data = _vm.tappedRepository;
調べた結果
tappedRepository で以下のように取得できているので
Dart
1RepositoryDataItems(full_name: flutter/flutter, owner: RepositoryDataOwner(avatar_url: https://avatars.githubusercontent.com/u/14101776?v=4), description: Flutter makes it easy and fast to build beautiful apps for mobile and beyond, stargazers_count: 141670, watchers_count: 141670, language: Dart, forks_count: 22351, open_issues_count: 10809)
late final WidgetRef _ref; とlateで_refを宣言しているため
lateで後の初期化を約束しているのに初期化されていないとないみたいです。
質問文
_refはAPIを取得する処理にも使っているので、_refをnullableにしていいのか?と疑問に思っております。onTap時にRepositoryDataItems以下のデータを渡すにはどのような
処理が最善になりますでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。