質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

987閲覧

riverpodの_refにLateInitializationErrorが出る

utasan_1008

総合スコア56

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2022/06/09 12:47

現状

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以下のデータを渡すにはどのような
処理が最善になりますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

遷移先でsetRef を呼び出すことでイニシャライズされ表示されることができました。
しかし、VMで

Dart

1StateProvider<RepositoryDataItems> _navigationIndexProvider = 2 StateProvider<RepositoryDataItems>((ref) => 3 const RepositoryDataItems( 4 full_name: "", 5 description: "", 6 stargazers_count: 0, 7 watchers_count: 0, 8 language: "", 9 forks_count: 0, 10 open_issues_count: 0, 11 owner: RepositoryDataOwner(avatar_url: ""), 12 ), 13);

と定義してしまうのは力技感が少しあり、いいのかと思っております。
詳しく調べるか、詳しい人に聞くかして追記したいと思います。

投稿2022/06/09 14:01

utasan_1008

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問