mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Add app bar and tab bar to a11y assessment app (#152904)
*Replace this paragraph with a description of what this PR is changing or adding, and why. Consider including before/after screenshots.* *List which issues are fixed by this PR. You must list at least one issue. An issue is not required if the PR fixes something trivial like a typo.* *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*
This commit is contained in:
parent
d7b092e42d
commit
454908185f
120
dev/a11y_assessments/lib/use_cases/app_bar.dart
Normal file
120
dev/a11y_assessments/lib/use_cases/app_bar.dart
Normal file
@ -0,0 +1,120 @@
|
||||
// Copyright 2014 The Flutter Authors. 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/material.dart';
|
||||
|
||||
import 'use_cases.dart';
|
||||
|
||||
class AppBarUseCase extends UseCase {
|
||||
@override
|
||||
String get name => 'AppBar';
|
||||
|
||||
@override
|
||||
String get route => '/app-bar';
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => const MainWidget();
|
||||
}
|
||||
|
||||
class MainWidget extends StatefulWidget {
|
||||
const MainWidget({super.key});
|
||||
|
||||
@override
|
||||
State<MainWidget> createState() => MainWidgetState();
|
||||
}
|
||||
|
||||
class MainWidgetState extends State<MainWidget> {
|
||||
int currentIndex = 0;
|
||||
|
||||
void _onChanged(int? value) {
|
||||
setState(() {
|
||||
currentIndex = value!;
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: <PreferredSizeWidget>[
|
||||
AppBar(
|
||||
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
||||
title: Semantics(headingLevel: 1, child: const Text('AppBar')),
|
||||
),
|
||||
AppBar(
|
||||
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
||||
title: Semantics(headingLevel: 1, child: const Text('AppBar')),
|
||||
actions: <Widget>[
|
||||
IconButton(
|
||||
icon: const Icon(Icons.add_alert),
|
||||
tooltip: 'Show Snackbar',
|
||||
onPressed: () {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('This is a snackbar')));
|
||||
},
|
||||
),
|
||||
IconButton(
|
||||
icon: const Icon(Icons.navigate_next),
|
||||
tooltip: 'Go to the next page',
|
||||
onPressed: () {
|
||||
Navigator.push(context, MaterialPageRoute<void>(
|
||||
builder: (BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.inversePrimary,
|
||||
title: Semantics(headingLevel: 1, child: const Text('Next Page')),
|
||||
),
|
||||
body: const Center(
|
||||
child: Text(
|
||||
'This is the next page',
|
||||
style: TextStyle(fontSize: 24),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
));
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
AppBar(
|
||||
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
|
||||
title: Semantics(headingLevel: 1, child: const Text('AppBar')),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
onPressed: () {},
|
||||
child: const Text('Action 1'),
|
||||
),
|
||||
TextButton(
|
||||
onPressed: () {},
|
||||
child: const Text('Action 2'),
|
||||
),
|
||||
],
|
||||
),
|
||||
][currentIndex],
|
||||
body: ListView(
|
||||
children: <Widget>[
|
||||
RadioListTile<int>(
|
||||
title: const Text('1. Simple app bar'),
|
||||
value: 0,
|
||||
groupValue: currentIndex,
|
||||
onChanged: _onChanged,
|
||||
),
|
||||
RadioListTile<int>(
|
||||
title: const Text('2. App bar with actions'),
|
||||
value: 1,
|
||||
groupValue: currentIndex,
|
||||
onChanged: _onChanged,
|
||||
),
|
||||
RadioListTile<int>(
|
||||
title: const Text('3. App bar with text buttons'),
|
||||
value: 2,
|
||||
groupValue: currentIndex,
|
||||
onChanged: _onChanged,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
66
dev/a11y_assessments/lib/use_cases/tab_bar_view.dart
Normal file
66
dev/a11y_assessments/lib/use_cases/tab_bar_view.dart
Normal file
@ -0,0 +1,66 @@
|
||||
// Copyright 2014 The Flutter Authors. 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/material.dart';
|
||||
|
||||
import 'use_cases.dart';
|
||||
|
||||
class TabBarViewUseCase extends UseCase {
|
||||
|
||||
@override
|
||||
String get name => 'TabBarView';
|
||||
|
||||
@override
|
||||
String get route => '/tab-bar-view';
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => const TabBarViewExample();
|
||||
}
|
||||
|
||||
|
||||
class TabBarViewExample extends StatelessWidget {
|
||||
const TabBarViewExample({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultTabController(
|
||||
initialIndex: 1,
|
||||
length: 3,
|
||||
child: Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Semantics(headingLevel: 1, child: const Text('TabBarView Sample')),
|
||||
bottom: const TabBar(
|
||||
tabs: <Widget>[
|
||||
Tab(
|
||||
icon: Icon(Icons.cloud_outlined),
|
||||
text: 'Cloudy',
|
||||
),
|
||||
Tab(
|
||||
icon: Icon(Icons.beach_access_sharp),
|
||||
text: 'Rainy',
|
||||
),
|
||||
Tab(
|
||||
icon: Icon(Icons.brightness_5_sharp),
|
||||
text: 'Sunny',
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
body: const TabBarView(
|
||||
children: <Widget>[
|
||||
Center(
|
||||
child: Text("It's cloudy here"),
|
||||
),
|
||||
Center(
|
||||
child: Text("It's rainy here"),
|
||||
),
|
||||
Center(
|
||||
child: Text("It's sunny here"),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -6,6 +6,7 @@ import 'package:flutter/widgets.dart';
|
||||
|
||||
import '../common/dynamic_title.dart';
|
||||
import 'action_chip.dart';
|
||||
import 'app_bar.dart';
|
||||
import 'auto_complete.dart';
|
||||
import 'badge.dart';
|
||||
import 'card.dart';
|
||||
@ -22,6 +23,7 @@ import 'radio_list_tile.dart';
|
||||
import 'slider.dart';
|
||||
import 'snack_bar.dart';
|
||||
import 'switch_list_tile.dart';
|
||||
import 'tab_bar_view.dart';
|
||||
import 'text_button.dart';
|
||||
import 'text_field.dart';
|
||||
import 'text_field_password.dart';
|
||||
@ -61,4 +63,6 @@ final List<UseCase> useCases = <UseCase>[
|
||||
DrawerUseCase(),
|
||||
NavigationDrawerUseCase(),
|
||||
NavigationRailUseCase(),
|
||||
AppBarUseCase(),
|
||||
TabBarViewUseCase(),
|
||||
];
|
||||
|
15
dev/a11y_assessments/test/app_bar_test.dart
Normal file
15
dev/a11y_assessments/test/app_bar_test.dart
Normal file
@ -0,0 +1,15 @@
|
||||
// Copyright 2014 The Flutter Authors. 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:a11y_assessments/use_cases/app_bar.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'test_utils.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('app bar can run', (WidgetTester tester) async {
|
||||
await pumpsUseCase(tester, AppBarUseCase());
|
||||
expect(find.text('AppBar'), findsOneWidget);
|
||||
});
|
||||
}
|
16
dev/a11y_assessments/test/tab_bar_view_test.dart
Normal file
16
dev/a11y_assessments/test/tab_bar_view_test.dart
Normal file
@ -0,0 +1,16 @@
|
||||
// Copyright 2014 The Flutter Authors. 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:a11y_assessments/use_cases/tab_bar_view.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'test_utils.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('tab bar view can run', (WidgetTester tester) async {
|
||||
await pumpsUseCase(tester, TabBarViewUseCase());
|
||||
expect(find.byType(TabBar), findsOneWidget);
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue
Block a user