-
Notifications
You must be signed in to change notification settings - Fork 2
/
holy_grail_layout.dart
179 lines (163 loc) 路 6.32 KB
/
holy_grail_layout.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import 'package:flutter/material.dart';
import 'package:responsive_styles/responsive_styles.dart';
class HolyGrailLayoutScreen extends StatelessWidget {
const HolyGrailLayoutScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Holy Grail Layout"),
),
body: const _HolyGrailLayoutBody(),
);
}
}
class _HolyGrailLayoutBody extends StatelessWidget {
const _HolyGrailLayoutBody({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
var responsive = Responsive(context);
double screenHeight = MediaQuery.of(context).size.height;
return GridItem(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: SingleChildScrollView(
child: GridItem(
children: [
const _Header(),
Container(
constraints: BoxConstraints(minHeight: screenHeight - 100),
color: responsive.value({
Breakpoints.xs: Colors.red.shade200,
Breakpoints.sm: Colors.yellow.shade200,
Breakpoints.md: Colors.green.shade200,
Breakpoints.lg: Colors.blue.shade200,
}),
child: GridItem(
as: Row,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
const _Body(),
_Aside(responsive: responsive),
],
),
),
const _Footer(),
],
),
),
),
],
);
}
}
class _Header extends StatelessWidget {
const _Header({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
double width = MediaQuery.of(context).size.width;
return Container(
width: width,
height: 50,
color: Colors.purple.shade500,
child: const GridItem(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Header',
),
],
),
);
}
}
class _Body extends StatelessWidget {
const _Body({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
var responsive = Responsive(context);
return Container(
color: Colors.red.shade100,
child: Container(
width: MediaQuery.of(context).size.width,
constraints: BoxConstraints(
maxWidth: responsive.value({
Breakpoints.xs: 500,
Breakpoints.lg: 600,
}),
),
child: GridItem(
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text(
'Body',
style: Theme.of(context).textTheme.headline4,
),
),
const Text(
'''
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam vestibulum lacus arcu, eget interdum neque eleifend nec. Donec sit amet sapien bibendum, pellentesque nibh id, molestie neque. Praesent id elit non turpis imperdiet placerat. Quisque non mollis sem. Morbi ac lorem dictum, fringilla nisi varius, viverra nunc. Mauris condimentum molestie efficitur. Vivamus vestibulum diam at vehicula aliquam. Proin sagittis dui at nisl feugiat, ac pellentesque nisl mattis. Vivamus imperdiet elit et erat molestie, id lacinia purus vestibulum. Nam maximus dui ut hendrerit rutrum. Maecenas ultrices augue non quam porta posuere sed nec odio.
Nullam vitae tellus a mauris suscipit feugiat vitae non nulla. Vestibulum massa elit, dapibus nec lorem id, gravida faucibus ligula. Fusce luctus risus vestibulum felis scelerisque euismod. Aenean quis sem dolor. Ut placerat turpis ut mattis convallis. Morbi hendrerit metus vitae quam tristique, ultricies rhoncus neque efficitur. In dapibus iaculis tempor. Curabitur ligula nunc, pulvinar quis sagittis eget, iaculis ac dolor. Aliquam ut tortor dapibus, sollicitudin augue suscipit, porta eros. Integer eget vulputate mauris, ac posuere tellus.
Praesent ac venenatis nunc. Maecenas eu tortor et nunc tempor feugiat. Morbi semper arcu id faucibus suscipit. Pellentesque volutpat vel nunc eu euismod. Fusce sagittis risus a porttitor lacinia. Suspendisse potenti. Sed nisi metus, ultricies vel dolor vitae, iaculis efficitur lorem.
Sed quis nunc iaculis, egestas erat facilisis, ornare sem. Nullam nec posuere ligula, ac rutrum tellus. Etiam accumsan lorem odio, nec vehicula ante euismod ut. Vivamus ultricies mi eget dui scelerisque, vel tincidunt turpis sodales. Aliquam tincidunt leo nec lacus aliquam mollis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam ut consectetur justo. Suspendisse vel tincidunt turpis. Nam et tincidunt leo. Donec tellus augue, tempor a cursus nec, aliquam sit amet nisi. Morbi sapien leo, semper at egestas sed, ullamcorper sit amet dui. Ut tristique eu orci vel commodo. Nam mollis pellentesque risus a dapibus.
''',
),
],
),
),
);
}
}
class _Aside extends StatelessWidget {
const _Aside({
Key? key,
required this.responsive,
}) : super(key: key);
final Responsive responsive;
@override
Widget build(BuildContext context) {
return Visibility(
visible: responsive.value({
Breakpoints.xs: false,
Breakpoints.md: true,
}),
child: Container(
width: 200,
color: Colors.red.shade100,
child: const Text('Aside'),
),
);
}
}
class _Footer extends StatelessWidget {
const _Footer({
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width;
return Container(
width: screenWidth,
color: Colors.purple.shade900,
height: 50,
child: const GridItem(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Footer',
style: TextStyle(color: Colors.white),
),
],
),
);
}
}