Menu
CoddyTech

Вкладки с панелью навигации

Часть раздела Списки и экраны путешествия по Flutter на Coddy. Урок 23 из 33.

Во многих приложениях основные страницы расположены на вкладках в нижней части экрана. NavigationBar отображает их; укажи его в bottomNavigationBar: у Scaffold.

NavigationBar(
  selectedIndex: index,
  onDestinationSelected: (int i) {
    setState(() {
      index = i;
    });
  },
  destinations: const [
    NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
    NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
  ],
)

Каждый NavigationDestination — это вкладка со значком и подписью. selectedIndex указывает, какая вкладка выделена; отсчёт начинается с 0. При нажатии на вкладку onDestinationSelected получает её индекс.

Панель сама не запоминает вкладку: храни index в состоянии и изменяй его с помощью setState. В теле отображается страница с этим индексом — здесь это pages[index] из списка виджетов.

challenge icon

Задание

Легко

На панели три вкладки, но нажатие на них ничего не делает. Добавь onDestinationSelected:, чтобы выбранная вкладка подсвечивалась и отображалась её страница: Favorites page для Favorites, Settings page для Settings.

Попробуйте сами

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int index = 0;
  final List<Widget> pages = const [
    Center(child: Text('Home page')),
    Center(child: Text('Favorites page')),
    Center(child: Text('Settings page')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('My App')),
      body: pages[index],
      bottomNavigationBar: NavigationBar(
        selectedIndex: index,
        destinations: const [
          NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
          NavigationDestination(icon: Icon(Icons.favorite), label: 'Favorites'),
          NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
        ],
      ),
    );
  }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Списки и экраны

Потренируйтесь самостоятельно: Онлайн-компилятор Flutter