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

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

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

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

Dart

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

Q&A

1回答

401閲覧

BottomNavigationBarを押すと画面の切り替えができるようにしたい。

ituking

総合スコア80

Flutter

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

Dart

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

0グッド

0クリップ

投稿2023/04/01 17:04

編集2023/04/02 03:31

実現したいこと

  • 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/

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

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

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

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

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

ituking

2023/04/01 17:04

```setting_profile_page.dart import 'dart:io'; import 'package:chat_app/firestore/user_firestore.dart'; import 'package:chat_app/model/user.dart'; import 'package:chat_app/utils/shared_prefs.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:image_picker/image_picker.dart'; class SettingProfilePage extends StatefulWidget { const SettingProfilePage({super.key}); @override State<SettingProfilePage> createState() => _SettingProfilePageState(); } class _SettingProfilePageState extends State<SettingProfilePage> { File? image; String imagePath = ''; final ImagePicker _picker = ImagePicker(); final TextEditingController controller = TextEditingController(); Future<void> selectImage() async { try { final XFile? pickedImage = await _picker.pickImage(source: ImageSource.gallery); if (pickedImage == null) return; final File imageFile = File(pickedImage.path); final Uint8List imageBytes = await imageFile.readAsBytes(); if (imageBytes.isNotEmpty) { setState(() { image = imageFile; }); } else { throw PlatformException( code: 'invalid_image', message: 'Cannot load representation of selected image', details: null); } } on PlatformException catch (e) { debugPrint('Image picker error: $e'); } } Future<void> uploadImage() async { String path = image!.path.substring(image!.path.lastIndexOf('/') + 1); final ref = FirebaseStorage.instance.ref(path); final storedImage = await ref.putFile(image!); imagePath = await storedImage.ref.getDownloadURL(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("Setting"), ), body: Padding( padding: const EdgeInsets.all(20.0), child: Column( children: [ Row( children: [ const SizedBox(width: 150, child: Text("Name")), Expanded( child: TextField( controller: controller, ), ), ], ), const SizedBox( height: 50, ), Row( children: [ const SizedBox(width: 150, child: Text("Profile Image")), Expanded( child: Container( alignment: Alignment.center, child: ElevatedButton( onPressed: () async { await selectImage(); uploadImage(); }, child: const Text("Select Image"), ), ), ), ], ), const SizedBox( height: 100, ), image == null ? const SizedBox() : SizedBox( width: 350, height: 200, child: Image.file( image!, fit: BoxFit.cover, )), const SizedBox( height: 150, ), SizedBox( width: 150, height: 40, child: ElevatedButton( onPressed: () async { User newProfile = User( name: controller.text, imagePath: imagePath, uid: SharedPrefs.fetchUid()!); await UserFirestore.updateUser(newProfile); }, child: const Text("Edit"), ), ), ], ), ), ); } } ```
guest

回答1

0

現在どのBottomNavigationBarのアイテムを押しているかを示すselectedIndexと、たぶん押されたもののページを定義しているpageListが_TopPageState内で使われていないので、ページ遷移しないのは当たり前では。

ページ移動をさせたいのであればBottomNavigationBarのonTapでpageList[selectedIndex]でpushするのでいいのでは。

投稿2023/04/02 00:50

ta.fu

総合スコア1667

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問