実現したいこと
- BottomNavigationBarを押すと画面の切り替えができるようにしたい。
前提
チャットアプリでBottomNavigationBarで画面が切り替わる機能を作っています。
発生している問題・エラーメッセージ
BottomNavigationBarの使用方法を見て、その後使ってみたのですが画面が切り替わらず、単一の画面が表示されるだけの状態となっています。
該当のソースコード
top_page.dart
1import 'package:chat_app/firestore/room_firestore.dart'; 2import 'package:chat_app/model/talk_room.dart'; 3import 'package:chat_app/pages/setting_profile_page.dart'; 4import 'package:chat_app/pages/talk_room_page.dart'; 5import 'package:cloud_firestore/cloud_firestore.dart'; 6import 'package:flutter/material.dart'; 7 8class TopPage extends StatefulWidget { 9 const TopPage({super.key}); 10 11 @override 12 State<TopPage> createState() => _TopPageState(); 13} 14 15class _TopPageState extends State<TopPage> { 16 int selectedIndex = 0; 17 List<Widget> pageList = [ 18 const TopPage(), 19 const SettingProfilePage(), 20 ]; 21 22 @override 23 Widget build(BuildContext context) { 24 return Scaffold( 25 appBar: AppBar( 26 title: const Text("ChatApp"), 27 actions: [ 28 IconButton( 29 onPressed: () { 30 Navigator.push( 31 context, 32 MaterialPageRoute( 33 builder: (context) => const SettingProfilePage(), 34 ), 35 ); 36 }, 37 icon: const Icon(Icons.settings), 38 ), 39 ], 40 ), 41 body: Column( 42 children: [ 43 StreamBuilder<QuerySnapshot>( 44 stream: RoomFireStore.joinedRoomSnapshot, 45 builder: (context, streamSnapshot) { 46 if (streamSnapshot.hasData) { 47 return FutureBuilder<List<TalkRoom>?>( 48 future: 49 RoomFireStore.fetchJoinedRooms(streamSnapshot.data!), 50 builder: (context, futureSnapshot) { 51 if (futureSnapshot.connectionState == 52 ConnectionState.waiting) { 53 return const Center( 54 child: CircularProgressIndicator(), 55 ); 56 } else { 57 if (futureSnapshot.hasData) { 58 List<TalkRoom> talkRooms = futureSnapshot.data!; 59 return ListView.builder( 60 itemCount: talkRooms.length, 61 itemBuilder: (context, index) { 62 return InkWell( 63 onTap: () { 64 Navigator.push( 65 context, 66 MaterialPageRoute( 67 builder: (context) => TalkRoomPage( 68 talkRoom: talkRooms[index], 69 ), 70 ), 71 ); 72 }, 73 child: SizedBox( 74 height: 70, 75 child: Row( 76 children: [ 77 Padding( 78 padding: const EdgeInsets.symmetric( 79 horizontal: 8.0), 80 child: CircleAvatar( 81 radius: 30, 82 backgroundImage: talkRooms[index] 83 .talkUser 84 .imagePath == 85 null 86 ? null 87 : NetworkImage( 88 talkRooms[index] 89 .talkUser 90 .imagePath!), 91 ), 92 ), 93 Column( 94 crossAxisAlignment: 95 CrossAxisAlignment.start, 96 mainAxisAlignment: 97 MainAxisAlignment.center, 98 children: [ 99 Text( 100 talkRooms[index].talkUser.name, 101 style: const TextStyle( 102 fontWeight: FontWeight.bold, 103 ), 104 ), 105 Text( 106 talkRooms[index].lastMessage ?? 107 "", 108 style: const TextStyle( 109 color: Colors.grey, 110 ), 111 ), 112 ], 113 ), 114 ], 115 ), 116 ), 117 ); 118 }); 119 } else { 120 return const Center( 121 child: Text("FAILED"), 122 ); 123 } 124 } 125 }); 126 } else { 127 return const Center( 128 child: CircularProgressIndicator(), 129 ); 130 } 131 }), 132 pageList[selectedIndex], 133 ], 134 ), 135 bottomNavigationBar: BottomNavigationBar( 136 items: const [ 137 BottomNavigationBarItem( 138 icon: Icon(Icons.wechat), 139 label: "Chats", 140 ), 141 BottomNavigationBarItem( 142 icon: Icon(Icons.settings), 143 label: "Setting", 144 ), 145 ], 146 currentIndex: selectedIndex, 147 onTap: (index) { 148 setState(() { 149 selectedIndex = index; 150 }); 151 }, 152 ), 153 ); 154 } 155} 156 157
試したこと
画面が切り替わらない問題が発生した後、BottomNavigationBarの使い方を調べ30分ほど見直したが解決せず。Flutter Cleanを実行した後、再実行したが状況改善せず。もしかしたら見落としているものがあるかも知れずそれによって画面が切り替わらないのかも知れないので、ここで質問させていただくことにしました。
長くなってしまったのでSettingProfilePage()はコメント欄に記載します。
補足情報(FW/ツールのバージョンなど)
[✓] Flutter (Channel stable, 3.7.8, on macOS 13.2.1 22D68 darwin-x64,
locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version
32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.2)
[✓] VS Code (version 1.76.2)
[✓] Connected device (3 available)
[✓] HTTP Host Availability
参考にしたページ・動画
pageListの使い方で参考にした動画
https://www.udemy.com/course/flutter-firebase-sns/learn/lecture/28160742#content
bodyが複数ある場合の実装方法に使用したページ
https://www.choge-blog.com/programming/flutterscaffold-bodymultiplewidget/
