1// Copyright 2014 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import 'package:flutter/foundation.dart';
6import 'package:flutter/material.dart';
7import 'package:flutter/rendering.dart';
8
9import 'use_cases/use_cases.dart';
10
11void main() {
12 runApp(const App());
13 if (kIsWeb) {
14 SemanticsBinding.instance.ensureSemantics();
15 }
16}
17
18class App extends StatelessWidget {
19 const App({super.key});
20
21 @override
22 Widget build(BuildContext context) {
23 final ThemeData lightTheme = ThemeData(
24 colorScheme: ColorScheme.fromSeed(
25 seedColor: const Color(0xff6750a4),
26 contrastLevel: MediaQuery.highContrastOf(context) ? 1.0 : 0.0,
27 ),
28 );
29 final ThemeData darkTheme = ThemeData(
30 colorScheme: ColorScheme.fromSeed(
31 brightness: Brightness.dark,
32 seedColor: const Color(0xff6750a4),
33 contrastLevel: MediaQuery.highContrastOf(context) ? 1.0 : 0.0,
34 ),
35 );
36
37 final Map<String, WidgetBuilder> routes = Map<String, WidgetBuilder>.fromEntries(
38 useCases.map(
39 (UseCase useCase) => MapEntry<String, WidgetBuilder>(
40 useCase.route,
41 (BuildContext context) => useCase.buildWithTitle(context),
42 ),
43 ),
44 );
45
46 return MaterialApp(
47 title: 'Accessibility Assessments Home Page',
48 theme: lightTheme,
49 darkTheme: darkTheme,
50 routes: <String, WidgetBuilder>{'/': (_) => const HomePage(), ...routes},
51 );
52 }
53}
54
55class HomePage extends StatefulWidget {
56 const HomePage({super.key});
57
58 @override
59 State<HomePage> createState() => HomePageState();
60}
61
62class HomePageState extends State<HomePage> {
63 final ScrollController scrollController = ScrollController();
64
65 @override
66 void dispose() {
67 scrollController.dispose();
68 super.dispose();
69 }
70
71 Widget _buildUseCaseItem(int index, UseCase useCase) {
72 return Padding(
73 padding: const EdgeInsets.all(10),
74 child: Builder(
75 builder: (BuildContext context) {
76 return TextButton(
77 key: Key(useCase.name),
78 onPressed: () =>
79 Navigator.of(context).pushNamed(useCase.route, arguments: useCase.name),
80 child: Text(useCase.name),
81 );
82 },
83 ),
84 );
85 }
86
87 @override
88 Widget build(BuildContext context) {
89 return Scaffold(
90 appBar: AppBar(
91 title: Semantics(headingLevel: 1, child: const Text('Accessibility Assessments')),
92 ),
93 body: Center(
94 child: ListView(
95 controller: scrollController,
96 children: List<Widget>.generate(
97 useCases.length,
98 (int index) => _buildUseCaseItem(index, useCases[index]),
99 ),
100 ),
101 ),
102 );
103 }
104}
105