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

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

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

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Dart

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

Q&A

解決済

1回答

2809閲覧

一瞬だけエラーが表示されるが動く場所の対処

SuperJulior

総合スコア12

Flutter

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Dart

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

0グッド

0クリップ

投稿2020/08/24 07:50

前提・実現したいこと

Flutterで辞書アプリを作っています。

別ページをみてから検索ページに入ると、そのページに切り替わった瞬間だけAppBarにエラーの文字が出ます。
ちゃんと動作はするので、問題ではないかもしれませんが、使用時に少しでもエラーメッセージが表示されてしまうなら厄介だなと思い、解決したいです。

発生している問題・エラーメッセージ

Dart

1The getter 'iterator' was called on null. 2Receiver: null 3Tried calling: iterator 4User-created ancestor of the error-causing widget was: 5 AppBar file:///dictionary_hands_on_hinagata-master%202/lib/MainTabs/Search/search.dart:63:17

該当のソースコード

Dart

1import 'package:flutter/material.dart'; 2import 'package:provider/provider.dart'; 3 4import 'package:dictionary/Services/database.dart'; 5import 'package:dictionary/Models/verbs_data.dart'; 6 7import 'words_list.dart'; 8import 'package:dictionary/MainTabs/Search/search_appbar_button.dart'; 9 10class Search extends StatefulWidget { 11 Search({Key key}) : super(key: key); 12 13 14 _Search createState() => new _Search(); 15} 16 17class _Search extends State<Search> { 18 TextEditingController editingController = TextEditingController(); 19 20 final duplicateItems = List<VerbsData>(); 21 final items = List<VerbsData>(); 22 final VerbsData verbsData; 23 24 _Search({this.verbsData}); 25 26 27 void initState() { 28 items.addAll(duplicateItems); 29 super.initState(); 30 } 31 32 void filterSearchResults(String query) { 33 List<VerbsData> dummySearchList = List<VerbsData>(); 34 dummySearchList.addAll(duplicateItems); 35 if (query.isNotEmpty) { 36 List<VerbsData> dummyListData = List<VerbsData>(); 37 dummySearchList.forEach((verbsData) { 38 if (verbsData.romaji.contains(query)) { 39 dummyListData.add(verbsData); 40 } 41 }); 42 setState(() { 43 items.clear(); 44 items.addAll(dummyListData); 45 }); 46 return; 47 } else { 48 setState(() { 49 items.clear(); 50 items.addAll(duplicateItems); 51 }); 52 } 53 } 54 55 56 Widget build(BuildContext context) { 57 return StreamProvider<List<VerbsData>>.value( 58 value: DatabaseService().verbs, 59 child: Scaffold( 60 appBar: AppBar( 61 leading: ButtonOnAppBar(), 62 title: Builder(builder: (context) { 63 final verbs = Provider.of<List<VerbsData>>(context); 64 duplicateItems.addAll(verbs); 65 items.addAll(verbs); 66 67 return Padding( 68 padding: const EdgeInsets.symmetric(vertical: 4.0), 69 child: TextField( 70 onChanged: (value) { 71 filterSearchResults(value); 72 }, 73 controller: editingController, 74 decoration: InputDecoration( 75 labelText: "Search", 76 fillColor: Colors.white, 77 filled: true, 78 prefixIcon: Icon(Icons.search), 79 border: OutlineInputBorder( 80 borderRadius: BorderRadius.all(Radius.circular(25.0)))), 81 ), 82 ); 83 }), 84 ), 85 body: SingleChildScrollView( 86 child: Column( 87 crossAxisAlignment: CrossAxisAlignment.start, 88 children: <Widget>[DropdownForSorts(), WordsList(verbs: items)], 89 ), 90 ), 91 ), 92 ); 93 } 94} 95 96class DropdownForSorts extends StatefulWidget { 97 98 _DropdownForSorts createState() { 99 return _DropdownForSorts(); 100 } 101} 102 103class _DropdownForSorts extends State<DropdownForSorts> { 104 String _value; 105 106 107 Widget build(BuildContext context) { 108 return Padding( 109 padding: EdgeInsets.all(10.0), 110 child: DropdownButton<String>( 111 items: [ 112 DropdownMenuItem<String>( 113 child: Text('Japanese Alphabetical'), 114 value: 'one', 115 ), 116 DropdownMenuItem<String>( 117 child: Text('Easier'), 118 value: 'two', 119 ), 120 DropdownMenuItem<String>( 121 child: Text('Difficult'), 122 value: 'three', 123 ), 124 DropdownMenuItem<String>( 125 child: Text('Often Used'), 126 value: 'four', 127 ), 128 DropdownMenuItem<String>( 129 child: Text('Rarely Used'), 130 value: 'five', 131 ), 132 ], 133 onChanged: (String value) { 134 setState(() { 135 _value = value; 136 }); 137 }, 138 hint: Text('Sorted by'), 139 value: _value, 140 )); 141 } 142} 143

試したこと

iteratorをコード上に書いていないので、どこがエラーなのかわかりません。
TextFieldの検索もちゃんと機能します。

補足情報(FW/ツールのバージョンなど)

Android Studio
MacOS Mojave 10.14.6

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

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

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

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

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

guest

回答1

0

ベストアンサー

とりあえずStreamProviderinitialDataを渡すと直るかもしれません。

dart

1return StreamProvider<List<VerbsData>>.value( 2 initialData: [], 3 value: ... 4 child: ...

ですが、現在AppBarの中のBuilderウィジェット内で行っているような処理は、buildメソッド内で行うべきでは無いと思います。

以下のように、didChangeDependencies内でストリームをlistenすることで、同様の処理ができると思います。(手元で試してないので、動かなかったらすいません...。)

dart

1class _SearchState extends State<Search> { 2 DatabaseService databaseService; 3 StreamSubscription verbsDataSubscription; 4 final List<VerbsData> items = []; 5 6 7 void initState() { 8 super.initState(); 9 databaseService = DatabaseService(); 10 } 11 12 13 void didChangeDependencies() { 14 super.didChangeDependencies(); 15 verbsDataSubscription ??= databaseService.verbs.listen((data) { 16 items.addAll(data); 17 }); 18 } 19 20 21 void dispose() { 22 verbsDataSubscription?.cancel(); 23 super.dispose(); 24 } 25 26 27 Widget build(BuildContext context) { 28 return Scaffold(); 29 } 30}

投稿2020/08/28 00:29

nskhei

総合スコア704

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

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

SuperJulior

2020/08/28 06:11

AppBar上のエラーが出なくなりました!ありがとうございます。 ただ、提示くださったコードの3行目のStreamSubscriptionで "Undefined class"というエラーが出ます。どうすればいいですか?
nskhei

2020/08/28 07:12

インポート文が抜けていました。 `import 'dart:async';`を追加してみて下さい。
SuperJulior

2020/08/28 07:41

できました!そして前より動きがよくなったように見えます!ありがとうございます! ちなみに、このdidChangeDependenciesでのlistenや、asyncの要素を使うことによって、どう変わったのですか?教えてください。
nskhei

2020/08/28 08:01

元のコードでは、配列のコピーを行う処理を`build()`内に書いていたため、setStateが呼ばれる度に毎回実行されていました。 改善後のコードでは、ストリームに新しい値が流れてきたときだけ配列のコピーが行われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問