実現したいこと
一覧画面→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}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。