自作アプリで、Firestoreのデータを用いてListviewを表示させたいです。
メインページからこちらのページに飛んでくるのですが、
イニシャライザでgetRecipeList()を使ってFirestoreからデータをgetDataMapListに取得し、
これを用いてListview.builderを作っています。
データにはレシピ名とその属性(name、category、flavor)をもっています。
一度はできていたのですが、別の機能(絞り込み)を実装しようとしている中で、
上手く動かなくなり、どこがおかしいのかわからなくなってしまいました。
ページに入った際はうまくリストが出ないのですが、
ホットリロードをすると表示されます。
また、イニシャライザの書き方がよくないのかと思い、
一番下にボタンでgetRecipeList();を起動するものも用意してみましたが、これもダメでした。
関係ない部分も多く含んでしまっており、読みにくいかと思いますが、
どなたかご指導いただけると幸いです。
Dart/Flutter
1 2class RecipeAdd extends StatefulWidget { 3 const RecipeAdd({Key? key}) : super(key: key); 4 5 State<RecipeAdd> createState() => _RecipeAddState(); 6} 7 8class _RecipeAddState extends State<RecipeAdd> { 9 10 _RecipeAddState(){ 11 getRecipeList(); 12 } 13 14 Future <void> getRecipeList()async{ 15 getDataMapList=[]; 16 final colRef = db.collection("recipe"); 17 var querySnapshot = await colRef.get(); // QuerySnapshot 18 var queryDocSnapshot = querySnapshot.docs; // List<QueryDocumentSnapshot> 19 for (final snapshot in queryDocSnapshot) { 20 final data = snapshot.data(); // 21 try { 22 getDataMapList.add(data); 23 } 24 catch(e){ 25 print("Error completing: $e"); 26 } 27 } 28 } 29String _addMenu =''; 30 int _selectedIndex = -1; 31 List getDataMapList= []; 32 33 34 Widget build(BuildContext context) { 35 var addSite = ModalRoute.of(context)?.settings.arguments; 36 bool selectedCheck = false; 37 return Scaffold( 38 body: Center( 39 child: Column( 40 mainAxisAlignment: MainAxisAlignment.spaceEvenly, 41 children: [ 42 Text("$addSiteのメニュー"), 43 SizedBox( height: 400, width: 350, 44 child: ListView.builder( 45 itemCount: getDataMapList.length, 46 itemBuilder: (BuildContext context, int index) { 47 String _flavorText=""; 48 for ( String flavor in getDataMapList[index]["flavor"]){ 49 _flavorText += flavor + "," ; 50 } 51 IconData? _catIcon; 52 if( getDataMapList[index]["category"]=="肉"){ 53 _catIcon = Icons.kebab_dining; 54 } 55 else if (getDataMapList[index]["category"]=="魚"){ 56 _catIcon = Icons.directions_boat_filled; 57 } 58 else{ 59 _catIcon = Icons.local_dining; 60 } 61 return Card( 62 child:ListTile( 63 leading: Icon(_catIcon), 64 title: Text(getDataMapList[index]["name"]), 65 selected: _selectedIndex == index ? true:false, 66 selectedTileColor: Colors.cyan.withOpacity(0.2), 67 subtitle: Text("tag: $_flavorText",style: TextStyle(fontSize: 12),), 68 onTap: (){ 69 setState(() { 70 _addMenu = getDataMapList[index]["name"]; 71 _selectedIndex = index; 72 }); 73 }, 74 ), 75 ); 76 }, 77 ), 78 ), 79 Row( 80 mainAxisAlignment: MainAxisAlignment.center, 81 children: [ 82 ElevatedButton( 83 onPressed: () => getRecipeList(), 84 child: Icon(Icons.search), 85 ), 86 Card( 87 child: Text("絞り込み項目"), 88 ) 89 ], 90 ), 91 Container( 92 width: 200, height: 80, 93 child: ElevatedButton( 94 onPressed: () { 95 Navigator.pop(context, _addMenu); 96 }, 97 child: Text("$_addMenu\nにする!",style: TextStyle(fontSize: 20), 98 ), 99 style: ElevatedButton.styleFrom(primary: Colors.deepOrange) 100 ), 101 ), 102 ElevatedButton( 103 style: ElevatedButton.styleFrom(primary: Colors.lightGreen), 104 onPressed:(){ 105 Navigator.of(context).pushNamed("/NewRecipe") 106 .then((value) => { 107 if (value!=null){ 108 Navigator.pop(context, value)} 109 }); 110 }, 111 child: Text("新しいメニュー"), 112 ), 113 ElevatedButton( 114 onPressed: (){ 115 setState(() { 116 getRecipeList(); 117 }); 118 }, 119 child: Text("手動ロード") 120 ), 121 ], 122 ), 123 ), 124 ); 125 } 126}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/29 05:17
2022/05/29 06:36
2022/05/29 11:07
2022/05/29 12:14
2022/05/31 10:05