1
0
mirror of https://github.com/flutter/samples.git synced 2025-11-14 11:28:36 +00:00

initial gallery

This commit is contained in:
Eric Windmill
2025-08-06 11:50:45 -04:00
parent 74378fc6f0
commit d6138c9ab8
150 changed files with 5390 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
import 'package:flutter/cupertino.dart';
import 'widgets_page.dart';
class GalleryHome extends StatelessWidget {
const GalleryHome({super.key});
@override
Widget build(BuildContext context) {
return CupertinoTabScaffold(
tabBar: CupertinoTabBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.list_bullet),
label: 'Widgets',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.settings),
label: 'Settings',
),
],
),
tabBuilder: (BuildContext context, int index) {
return CupertinoTabView(
builder: (BuildContext context) {
return switch (index) {
0 => const WidgetsPage(),
1 => const Center(child: Text('Settings')),
_ => const Center(child: Text('Widgets')),
};
},
);
},
);
}
}

View File

@@ -0,0 +1,24 @@
// Copyright 2022 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'gallery_home.dart';
void main() {
runApp(const CupertinoGalleryApp());
}
class CupertinoGalleryApp extends StatelessWidget {
const CupertinoGalleryApp({super.key});
@override
Widget build(BuildContext context) {
return const CupertinoApp(
title: 'Cupertino Gallery',
home: GalleryHome(),
);
}
}

View File

@@ -0,0 +1,86 @@
import 'package:flutter/cupertino.dart';
import 'widgets/action_sheet_page.dart';
import 'widgets/activity_indicator_page.dart';
import 'widgets/alert_dialog_page.dart';
import 'widgets/button_page.dart';
import 'widgets/context_menu_page.dart';
import 'widgets/date_picker_page.dart';
import 'widgets/list_tile_page.dart';
import 'widgets/navigation_bar_page.dart';
import 'widgets/page_scaffold_page.dart';
import 'widgets/picker_page.dart';
import 'widgets/popup_surface_page.dart';
import 'widgets/scrollbar_page.dart';
import 'widgets/search_text_field_page.dart';
import 'widgets/segmented_control_page.dart';
import 'widgets/slider_page.dart';
import 'widgets/sliding_segmented_control_page.dart';
import 'widgets/switch_page.dart';
import 'widgets/tab_bar_page.dart';
import 'widgets/tab_scaffold_page.dart';
import 'widgets/tab_view_page.dart';
import 'widgets/text_field_page.dart';
import 'widgets/text_theme_page.dart';
import 'widgets/time_picker_page.dart';
class WidgetDetailPage extends StatelessWidget {
const WidgetDetailPage({super.key, required this.title});
final String title;
@override
Widget build(BuildContext context) {
switch (title) {
case 'Action Sheet':
return const ActionSheetPage();
case 'Activity Indicator':
return const ActivityIndicatorPage();
case 'Alert Dialog':
return const AlertDialogPage();
case 'Button':
return const ButtonPage();
case 'Context Menu':
return const ContextMenuPage();
case 'Date Picker':
return const DatePickerPage();
case 'List Tile':
return const ListTilePage();
case 'Picker':
return const PickerPage();
case 'Popup Surface':
return const PopupSurfacePage();
case 'Scrollbar':
return const ScrollbarPage();
case 'Search Text Field':
return const SearchTextFieldPage();
case 'Segmented Control':
return const SegmentedControlPage();
case 'Slider':
return const SliderPage();
case 'Sliding Segmented Control':
return const SlidingSegmentedControlPage();
case 'Switch':
return const SwitchPage();
case 'Tab Bar':
return const TabBarPage();
case 'Tab Scaffold':
return const TabScaffoldPage();
case 'Tab View':
return const TabViewPage();
case 'Text Field':
return const TextFieldPage();
case 'Text Theme':
return const TextThemePage();
case 'Time Picker':
return const TimePickerPage();
default:
return const CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Widget Not Found'),
),
child: Center(child: Text('Widget Not Found')),
);
}
}
}

View File

@@ -0,0 +1,49 @@
import 'package:flutter/cupertino.dart';
class ActionSheetPage extends StatelessWidget {
const ActionSheetPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Action Sheet'),
),
child: Center(
child: CupertinoButton(
child: const Text('Show Action Sheet'),
onPressed: () {
showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) => CupertinoActionSheet(
title: const Text('Title'),
message: const Text('Message'),
actions: <CupertinoActionSheetAction>[
CupertinoActionSheetAction(
child: const Text('Action One'),
onPressed: () {
Navigator.pop(context);
},
),
CupertinoActionSheetAction(
child: const Text('Action Two'),
onPressed: () {
Navigator.pop(context);
},
)
],
cancelButton: CupertinoActionSheetAction(
isDefaultAction: true,
onPressed: () {
Navigator.pop(context);
},
child: const Text('Cancel'),
),
),
);
},
),
),
);
}
}

View File

@@ -0,0 +1,17 @@
import 'package:flutter/cupertino.dart';
class ActivityIndicatorPage extends StatelessWidget {
const ActivityIndicatorPage({super.key});
@override
Widget build(BuildContext context) {
return const CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Activity Indicator'),
),
child: Center(
child: CupertinoActivityIndicator(),
),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/cupertino.dart';
class AlertDialogPage extends StatelessWidget {
const AlertDialogPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Alert Dialog'),
),
child: Center(
child: CupertinoButton(
child: const Text('Show Alert Dialog'),
onPressed: () {
showCupertinoDialog<void>(
context: context,
builder: (BuildContext context) => CupertinoAlertDialog(
title: const Text('Alert'),
content: const Text('This is a sample alert dialog.'),
actions: <CupertinoDialogAction>[
CupertinoDialogAction(
child: const Text('OK'),
onPressed: () {
Navigator.pop(context);
},
),
],
),
);
},
),
),
);
}
}

View File

@@ -0,0 +1,42 @@
import 'package:flutter/cupertino.dart';
class ButtonPage extends StatelessWidget {
const ButtonPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(middle: Text('Button')),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'CupertinoButton widget',
style: CupertinoTheme.of(context).textTheme.textStyle,
),
const SizedBox(height: 16),
CupertinoButton(child: const Text('Enabled'), onPressed: () {}),
const SizedBox(height: 16),
const CupertinoButton(onPressed: null, child: Text('Disabled')),
const SizedBox(height: 32),
Text(
'CupertinoButton.filled widget',
style: CupertinoTheme.of(context).textTheme.textStyle,
),
const SizedBox(height: 16),
CupertinoButton.filled(
child: const Text('Enabled'),
onPressed: () {},
),
const SizedBox(height: 16),
const CupertinoButton.filled(
onPressed: null,
child: Text('Disabled'),
),
],
),
),
);
}
}

View File

@@ -0,0 +1,42 @@
import 'package:flutter/cupertino.dart';
class ContextMenuPage extends StatelessWidget {
const ContextMenuPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(middle: Text('Context Menu')),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Long press to activate context menu:'),
SizedBox(height: 16),
SizedBox(
width: 100,
height: 100,
child: CupertinoContextMenu(
actions: <Widget>[
CupertinoContextMenuAction(
child: const Text('Action one'),
onPressed: () {
Navigator.pop(context);
},
),
CupertinoContextMenuAction(
child: const Text('Action two'),
onPressed: () {
Navigator.pop(context);
},
),
],
child: Container(color: CupertinoColors.activeBlue),
),
),
],
),
),
);
}
}

View File

@@ -0,0 +1,22 @@
import 'package:flutter/cupertino.dart';
class DatePickerPage extends StatelessWidget {
const DatePickerPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Date Picker'),
),
child: Center(
child: SizedBox(
height: 200,
child: CupertinoDatePicker(
onDateTimeChanged: (DateTime newDate) {},
),
),
),
);
}
}

View File

@@ -0,0 +1,62 @@
import 'package:flutter/cupertino.dart';
class ListTilePage extends StatelessWidget {
const ListTilePage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(middle: Text('List Tile')),
child: Center(
child: ListView(
children: [
CupertinoListSection(
children: [
CupertinoListTile(
title: Text('Title'),
subtitle: Text('Subtitle'),
leading: Icon(CupertinoIcons.info),
trailing: Icon(CupertinoIcons.forward),
),
CupertinoListTile(
title: Text('Title'),
subtitle: Text('Subtitle'),
leading: Icon(CupertinoIcons.person),
trailing: Icon(CupertinoIcons.forward),
),
CupertinoListTile(
title: Text('Title'),
subtitle: Text('Subtitle'),
leading: Icon(CupertinoIcons.wifi),
trailing: Icon(CupertinoIcons.forward),
),
],
),
CupertinoListSection(
children: [
CupertinoListTile(
title: Text('Title'),
subtitle: Text('Subtitle'),
leading: Icon(CupertinoIcons.search),
trailing: Icon(CupertinoIcons.forward),
),
CupertinoListTile(
title: Text('Title'),
subtitle: Text('Subtitle'),
leading: Icon(CupertinoIcons.heart_fill),
trailing: Icon(CupertinoIcons.forward),
),
CupertinoListTile(
title: Text('Title'),
subtitle: Text('Subtitle'),
leading: Icon(CupertinoIcons.ant),
trailing: Icon(CupertinoIcons.forward),
),
],
),
],
),
),
);
}
}

View File

@@ -0,0 +1,28 @@
import 'package:flutter/cupertino.dart';
class PickerPage extends StatelessWidget {
const PickerPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Picker'),
),
child: Center(
child: SizedBox(
height: 200,
child: CupertinoPicker(
itemExtent: 32,
onSelectedItemChanged: (int index) {},
children: const <Widget>[
Text('One'),
Text('Two'),
Text('Three'),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/cupertino.dart';
class PopupSurfacePage extends StatelessWidget {
const PopupSurfacePage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Popup Surface'),
),
child: Center(
child: CupertinoButton(
child: const Text('Show Popup Surface'),
onPressed: () {
showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) {
return CupertinoPopupSurface(
child: Container(
color: CupertinoColors.white,
width: 200,
height: 200,
child: const Center(
child: Text('This is a popup surface.'),
),
),
);
},
);
},
),
),
);
}
}

View File

@@ -0,0 +1,26 @@
import 'package:flutter/cupertino.dart';
class ScrollbarPage extends StatelessWidget {
const ScrollbarPage({super.key});
@override
Widget build(BuildContext context) {
final ScrollController _controller = ScrollController();
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(middle: Text('Scrollbar')),
child: CupertinoScrollbar(
controller: _controller,
child: ListView.separated(
controller: _controller,
itemCount: 100,
itemBuilder: (BuildContext context, int index) {
return CupertinoListTile(title: Text('Item $index'));
},
separatorBuilder: (BuildContext context, int index) {
return Container(height: 1, color: CupertinoColors.opaqueSeparator);
},
),
),
);
}
}

View File

@@ -0,0 +1,20 @@
import 'package:flutter/cupertino.dart';
class SearchTextFieldPage extends StatelessWidget {
const SearchTextFieldPage({super.key});
@override
Widget build(BuildContext context) {
return const CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Search Text Field'),
),
child: Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: CupertinoSearchTextField(),
),
),
);
}
}

View File

@@ -0,0 +1,36 @@
import 'package:flutter/cupertino.dart';
class SegmentedControlPage extends StatefulWidget {
const SegmentedControlPage({super.key});
@override
State<SegmentedControlPage> createState() => _SegmentedControlPageState();
}
class _SegmentedControlPageState extends State<SegmentedControlPage> {
int _selectedIndex = 0;
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Segmented Control'),
),
child: Center(
child: CupertinoSegmentedControl<int>(
children: const <int, Widget>{
0: Text('One'),
1: Text('Two'),
2: Text('Three'),
},
onValueChanged: (int val) {
setState(() {
_selectedIndex = val;
});
},
groupValue: _selectedIndex,
),
),
);
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/cupertino.dart';
class SliderPage extends StatefulWidget {
const SliderPage({super.key});
@override
State<SliderPage> createState() => _SliderPageState();
}
class _SliderPageState extends State<SliderPage> {
double _value = 0.5;
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Slider'),
),
child: Center(
child: CupertinoSlider(
value: _value,
onChanged: (double value) {
setState(() {
_value = value;
});
},
),
),
);
}
}

View File

@@ -0,0 +1,38 @@
import 'package:flutter/cupertino.dart';
class SlidingSegmentedControlPage extends StatefulWidget {
const SlidingSegmentedControlPage({super.key});
@override
State<SlidingSegmentedControlPage> createState() =>
_SlidingSegmentedControlPageState();
}
class _SlidingSegmentedControlPageState
extends State<SlidingSegmentedControlPage> {
int? _groupValue = 0;
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Sliding Segmented Control'),
),
child: Center(
child: CupertinoSlidingSegmentedControl<int>(
children: const <int, Widget>{
0: Text('One'),
1: Text('Two'),
2: Text('Three'),
},
onValueChanged: (int? value) {
setState(() {
_groupValue = value;
});
},
groupValue: _groupValue,
),
),
);
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/cupertino.dart';
class SwitchPage extends StatefulWidget {
const SwitchPage({super.key});
@override
State<SwitchPage> createState() => _SwitchPageState();
}
class _SwitchPageState extends State<SwitchPage> {
bool _value = true;
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Switch'),
),
child: Center(
child: CupertinoSwitch(
value: _value,
onChanged: (bool value) {
setState(() {
_value = value;
});
},
),
),
);
}
}

View File

@@ -0,0 +1,22 @@
import 'package:flutter/cupertino.dart';
class TextFieldPage extends StatelessWidget {
const TextFieldPage({super.key});
@override
Widget build(BuildContext context) {
return const CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text('Text Field'),
),
child: Center(
child: Padding(
padding: EdgeInsets.all(16.0),
child: CupertinoTextField(
placeholder: 'Enter text',
),
),
),
);
}
}

View File

@@ -0,0 +1,58 @@
import 'package:flutter/cupertino.dart';
class TextThemePage extends StatelessWidget {
const TextThemePage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Text Theme'),
),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'This is the default text style',
style: CupertinoTheme.of(context).textTheme.textStyle,
),
const SizedBox(height: 16),
Text(
'This is the action text style',
style: CupertinoTheme.of(context).textTheme.actionTextStyle,
),
const SizedBox(height: 16),
Text(
'This is the tab label text style',
style: CupertinoTheme.of(context).textTheme.tabLabelTextStyle,
),
const SizedBox(height: 16),
Text(
'This is the nav title text style',
style: CupertinoTheme.of(context).textTheme.navTitleTextStyle,
),
const SizedBox(height: 16),
Text(
'This is the nav large title text style',
style: CupertinoTheme.of(context)
.textTheme
.navLargeTitleTextStyle,
),
const SizedBox(height: 16),
Text(
'This is the picker text style',
style: CupertinoTheme.of(context).textTheme.pickerTextStyle,
),
const SizedBox(height: 16),
Text(
'This is the date time picker text style',
style:
CupertinoTheme.of(context).textTheme.dateTimePickerTextStyle,
),
],
),
),
);
}
}

View File

@@ -0,0 +1,22 @@
import 'package:flutter/cupertino.dart';
class TimePickerPage extends StatelessWidget {
const TimePickerPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
middle: Text('Time Picker'),
),
child: Center(
child: SizedBox(
height: 200,
child: CupertinoTimerPicker(
onTimerDurationChanged: (Duration newDuration) {},
),
),
),
);
}
}

View File

@@ -0,0 +1,75 @@
import 'package:flutter/cupertino.dart';
import 'widget_detail_page.dart';
class WidgetsPage extends StatelessWidget {
const WidgetsPage({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
child: CustomScrollView(
slivers: <Widget>[
CupertinoSliverNavigationBar(largeTitle: Text('Cupertino Gallery')),
SliverFillRemaining(
child: ListView(
children: [
CustomCupertinoListTile(title: 'Action Sheet'),
CustomCupertinoListTile(title: 'Activity Indicator'),
CustomCupertinoListTile(title: 'Alert Dialog'),
CustomCupertinoListTile(title: 'Button'),
CustomCupertinoListTile(title: 'Context Menu'),
CustomCupertinoListTile(title: 'Date Picker'),
CustomCupertinoListTile(title: 'List Tile'),
CustomCupertinoListTile(title: 'Picker'),
CustomCupertinoListTile(title: 'Popup Surface'),
CustomCupertinoListTile(title: 'Scrollbar'),
CustomCupertinoListTile(title: 'Search Text Field'),
CustomCupertinoListTile(title: 'Segmented Control'),
CustomCupertinoListTile(title: 'Slider'),
CustomCupertinoListTile(title: 'Sliding Segmented Control'),
CustomCupertinoListTile(title: 'Switch'),
CustomCupertinoListTile(title: 'Tab Bar'),
CustomCupertinoListTile(title: 'Tab Scaffold'),
CustomCupertinoListTile(title: 'Tab View'),
CustomCupertinoListTile(title: 'Text Field'),
CustomCupertinoListTile(title: 'Text Theme'),
CustomCupertinoListTile(title: 'Time Picker'),
],
),
),
],
),
);
}
}
class CustomCupertinoListTile extends StatelessWidget {
const CustomCupertinoListTile({super.key, required this.title});
final String title;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
Navigator.of(context).push(
CupertinoPageRoute<void>(
builder: (BuildContext context) {
return WidgetDetailPage(title: title);
},
),
);
},
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 12.0),
decoration: const BoxDecoration(
border: Border(bottom: BorderSide(color: CupertinoColors.separator)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[Text(title), const Icon(CupertinoIcons.forward)],
),
),
);
}
}