LoginSignup
3
3

More than 3 years have passed since last update.

[Flutter] BottomNavigationBarを5画面作成してみた。

Last updated at Posted at 2021-04-30

ゴール

今回は5画面に分けて作成したいと思います。
間違えていたり、足りない点がありましたら教えていただくと助かります。
タイトルなし.gif

動作環境

  • OS: macOS Catalina(11.2.3)
  • Xcode: Version 12.4
  • Android Studio: Version 4.1

  • [✓] Flutter (Channel stable, 1.22.4, on macOS 11.2.3 20D91 darwin-x64, locale
    ja-JP)

  • [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2)

  • [✓] Xcode - develop for iOS and macOS (Xcode 12.4)

  • [✓] Android Studio (version 4.1)

  • [✓] Android Studio (version 4.1)

  • [✓] Connected device (1 available)

全体のコード

home_screen.dart
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:surfing_sns/view/page/feed_page.dart';
import 'package:surfing_sns/view/page/profile_page.dart';
import 'package:surfing_sns/view/page/surf_search_page.dart';
import 'package:surfing_sns/view/page/team_page.dart';
import 'package:surfing_sns/view/page/weather_page.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
 List<Widget> _pages;
 int _currentIndex = 0;

@override
void initState() {
  _pages = [
    FeedPage(),
    SurfSearchPage(),
    TeamPage(),
    WeatherPage(),
    ProfilePage(),
  ];
  super.initState();
}


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        currentIndex: _currentIndex,
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        items: [
          BottomNavigationBarItem(
              icon: FaIcon(FontAwesomeIcons.home),
              label: ("Home"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.search),
            label: ("Search"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.plusSquare),
            label: ("Team"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.sun),
            label: ("Weather"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.user),
            label: ("Profile"),
          ),
        ],
      ),
    );
  }
}

進め方(5つのステップ)

1、 ナビゲーションで遷移する先の画面の設定(List形式)
2、 遷移先の画面を示す配列番号の設定
3、 BottomNavigationBarItemの設定
4、 Itemが押された時の処理の設定
5、 遷移先の画面の表示
 

1、 ナビゲーションで遷移する先の画面の設定(List形式)

_pagesというListに遷移先のページを格納していきます。

  List<Widget> _pages;

  @override
  void initState() {
    _pages = [
      FeedPage(),
      SurfSearchPage(),
      TeamPage(),
      WeatherPage(),
      ProfilePage(),
    ];
    super.initState();
  }

2、 遷移先の画面を示す配列番号の設定[currentIndex]

変数プロパティの作成
初めに表示するページをHomeとします。

  List<Widget> _pages;
  int _currentIndex = 0;//Homeからスタートさせる為

  @override
  void initState() {
    _pages = [
      FeedPage(),
      SurfSearchPage(),
      TeamPage(),
      WeatherPage(),
      ProfilePage(),
    ];
    super.initState();
  }

3、 BottomNavigationBarItemの設定[items]

BottomNavigationBarに[items]という属性がある。
items (List BottomNavigationBarItem)
このListを5つ並べてあげる
iconはfont_awesome_flutterを使用しています。

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text('サンプル'),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.home),
            label: ("Home"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.search),
            label: ("Search"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.plusSquare),
            label: ("Team"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.sun),
            label: ("Weather"),
          ),
          BottomNavigationBarItem(
            icon: FaIcon(FontAwesomeIcons.user),
            label: ("Profile"),
          ),
        ],
      ),
    );
  }

4、 Itemが押された時の処理の設定[onTap]

2、に押された配列番号をセットします。ページに飛ばしてあげる作業になります。
onTap属性は引数一つが入った関数になります。
StatefulWidgetを使っているので、setStateを使います

 bottomNavigationBar: BottomNavigationBar(
 onTap: (index) {
          setState(() {
            _currentIndex = index; //タップした時に配列に行かせる
          });
        },

5、 遷移先の画面の表示[Scafold,body属性に入れる]

 return Scaffold(
      body: _pages[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,//属性追加
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },

感想

割とシンプルで、理解できたかなと思います。
最後に、ガチなTODOアプリをリリースしております、みてくださると光栄です。
ガチDO

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3