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

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

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

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

Dart

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

Q&A

1回答

104閲覧

【Flutter】Riverpod v2で配列を更新すると、警告が出る

sushiosushi

総合スコア0

Flutter

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

Dart

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

0グッド

0クリップ

投稿2024/03/26 16:25

編集2024/03/26 16:27

実現したいこと

一覧画面→TodoAdd画面に移動しTodoを新規作成後、一覧画面に戻ると作成したTodoがListViewに追加されているようにしたい。

バージョン

environment:
sdk: '>=3.3.2 <4.0.0'

dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^2.5.1
riverpod_annotation: ^2.3.5

dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
riverpod_generator: ^2.4.0
build_runner: ^2.4.8

発生している問題

下記コードの stateにて以下2つの警告が出る。

todo_add_page.dart

1final todosState = ref.read(todoProvider); 2todosState.add(_controller.text); 3ref.read(todoProvider.notifier).state = [...todosState];
The member 'state' can only be used within instance members of subclasses of 'package:riverpod/src/notifier.dart'. The member 'state' can only be used within 'package:riverpod/src/notifier.dart' or a test.

該当のソースコード

todo_add_page.dart

1import 'package:flutter/material.dart'; 2import 'package:flutter/widgets.dart'; 3import 'package:flutter_riverpod/flutter_riverpod.dart'; 4import 'package:todo/todo_provider.dart'; 5 6class TodoAddPage extends ConsumerStatefulWidget { 7 const TodoAddPage({super.key}); 8 9 @override 10 TodoAddPageState createState() => TodoAddPageState(); 11} 12 13class TodoAddPageState extends ConsumerState<TodoAddPage> { 14 final TextEditingController _controller = TextEditingController(); 15 16 @override 17 void initState() { 18 super.initState(); 19 ref.read(todoProvider); 20 } 21 22 @override 23 void dispose() { 24 _controller.dispose(); 25 super.dispose(); 26 } 27 28 @override 29 Widget build(BuildContext context) { 30 return Scaffold( 31 appBar: AppBar( 32 title: const Text('Add Page'), 33 backgroundColor: Colors.blue, 34 ), 35 body: Container( 36 margin: const EdgeInsets.symmetric(horizontal: 64), 37 child: Column( 38 mainAxisAlignment: MainAxisAlignment.center, 39 children: [ 40 const Text('add page'), 41 TextField( 42 controller: _controller, 43 onChanged: (value) {}, 44 ), 45 const SizedBox( 46 height: 10, 47 width: double.infinity, 48 ), 49 SizedBox( 50 width: double.infinity, 51 child: ElevatedButton( 52 onPressed: () { 53 final todosState = ref.read(todoProvider); 54 todosState.add(_controller.text); 55 ref.read(todoProvider.notifier).state = [...todosState]; 56 _controller.clear(); 57 }, 58 style: ElevatedButton.styleFrom( 59 backgroundColor: Colors.blue, 60 shape: const RoundedRectangleBorder( 61 borderRadius: BorderRadius.all(Radius.zero))), 62 child: const Text( 63 'リスト追加', 64 style: TextStyle(color: Colors.white), 65 ), 66 ), 67 ), 68 const SizedBox( 69 height: 10, 70 width: double.infinity, 71 ), 72 SizedBox( 73 width: double.infinity, 74 child: TextButton( 75 onPressed: () { 76 Navigator.of(context).pop(); 77 }, 78 child: const Text('キャンセル'), 79 )), 80 ], 81 ), 82 ), 83 ); 84 } 85}

todo_provider.dart

1import 'package:riverpod_annotation/riverpod_annotation.dart'; 2 3part 'todo_provider.g.dart'; 4 5@riverpod 6class Todo extends _$Todo { 7 @override 8 List<String> build() { 9 return []; 10 } 11 12 void add(String title) { 13 state.add(title); 14 } 15}

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

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

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

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

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

guest

回答1

0

ToDoのstateが@protected annotationで宣言されてるんで、ToDo内部で使う以外ではDartのlinterで警告が出るようになっているというのが理由です。
stateの実体は基底クラスのNotifierBaseで定義されてます。

ToDoに例えば以下の様なsetterを追加して、呼び出し側ではref.read(todoProvider.notifier).values = [...todosState];の様に呼び出せば警告は出ないと思います。

dart

1 set values(List<String> value) { 2 state = value; 3 }

stateが@protected宣言されている理由とか、riverpodのドキュメントにはstateをクラスメソッド外で使用しているのになぜなんだという疑問はあると思います。
前者はオリジナルのドキュメント内で制作者の変更理由が書かれているものがないんで、ちょっと不明です。後者に関しては単純に修正が間に合っていないだけのようです。

投稿2024/03/27 08:42

ta.fu

総合スコア1667

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問