サイドドロワー
CoddyのFlutterジャーニー「リストと画面」セクションの一部。レッスン 25/33。
Drawerは、タブに収まらないアプリ内の項目を表示するために、横からスライドして現れるパネルです。Scaffoldに設定します。
Scaffold(
appBar: AppBar(title: Text(folder)),
drawer: Drawer(
child: ListView(
children: [
const DrawerHeader(child: Text('Mail')),
ListTile(
title: const Text('Sent'),
onTap: () {
setState(() {
folder = 'Sent';
});
Navigator.pop(context);
},
),
],
),
),
)Drawerを設定すると、アプリバーの先頭に三本線のメニューボタンが表示されます。タップするか、画面端からスワイプすると、Drawerが開きます。
Drawerは、何かが閉じるまで開いたままです。開いたDrawerはページの上に重なる画面のようなものなので、Navigator.pop(context)で閉じます。項目がタップされた後に呼び出さないと、Drawerが選択したページを覆ったままになります。
DrawerHeaderは上部の大きな領域で、アプリ名やサインイン中のアカウントを表示するために使います。
チャレンジ
簡単メニューボタンでドロワーを開きます。現在は Inbox だけがあります。Inbox の行と同じように、folder を設定してドロワーを閉じる行をあと2つ追加してください。
Sent、Icons.sendを使用Trash、Icons.deleteを使用
自分で試してみよう
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> {
String folder = 'Inbox';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(folder)),
body: Center(
child: Text('No messages in $folder'),
),
drawer: Drawer(
child: ListView(
children: [
const DrawerHeader(
child: Text('Mail', style: TextStyle(fontSize: 24)),
),
ListTile(
leading: const Icon(Icons.inbox),
title: const Text('Inbox'),
onTap: () {
setState(() {
folder = 'Inbox';
});
Navigator.pop(context);
},
),
],
),
),
);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
リストと画面のすべてのレッスン
自分で練習してみよう: Flutterオンラインコンパイラ