์ง๋ ์คํ
๊น์ง ์ ๋ฐ๋ผ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ชจ๋ ๋๋ผ๋ฏ, ํ์ฌ๋ ํจ๋ฉ๋ ๋ง์ง ์๊ณ , ์ฐ๋ฆฌ๊ฐ ์ค์ํ๊ฒ ๋ณด์ฌ์ค์ผ ํ ๋ฐ์ดํฐ์ธ word๊ฐ ํ ๋์ ๋ค์ด์ค์ง ์๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ๋๋ผ๊ธฐ์ ์กฐ๊ธ ๋ ์ฝ๊ฒ, ์ํ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋๋ก ํด์ผํ๋ค.
๊ทธ๋์ ์ด๋ฒ ์คํ
์์๋ ์ด๋ฌํ ์๊ฐ์ ์ธ ์์(๋์์ธ) ์ ์กฐ๊ธ ์ ๊ฒฝ์ ์จ๋ณด๋ ค๊ณ ํ๋ค.
์ฝ๋๋ฉ์์ ์ ์ํ ๋ค์ ์ฐ๋ฆฌ์ ๋ชฉํ ๋ ์ด ์ด๋ฏธ์ง์ ๊ฐ๋ค.
์ฐ๋ฆฌ์ ๋ชฉํ !!
ํ์ฌ ์ฐ๋ฆฌ ์ฝ๋์์๋ word pair๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ด๊ณ ์๋ค.
Text(appState.current.asLowerCase)
์ด ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ๋ณต์กํ๊ฒ ๋ฐ๊ฟ๋ณด๋ ค๊ณ ํ๋ค. ์ด ์ฝ๋๋ฅผ ๋ณ๋์ ์์ ฏ์ผ๋ก ๋นผ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
์ด์ฒ๋ผ UI์ ๊ฐ ์์์ ๋ํด ๋ณ๋์ ์์ ฏ์ ๊ฐ๋ ๊ฒ์ Flutter์์ ์ฝ๋์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ์ค์ํ ๋ฐฉ๋ฒ์ด๋ค.
(+ ๋ด ๊ฒฝํ์ ๋น์ถ์ด๋ณด๋ฉด, ์ด๋ฅผ ๋ฐ๋ก ์์ ฏ์ผ๋ก ๋นผ์ ๋ง๋ค์ด๋๋ฉด ๋์ค์ ๋ ์ฐ์ผ ๋ ๋ค์ ์ฝ๋๋ฅผ ์ง๊ฑฐ๋, ์ด์ ์ฝ๋๋ฅผ ์ฐพ์ ๋ณต๋ถํ๋ ์ผ์ ํ์ง ์์๋ ๋๋ค. ๋ํ, ์์ ์ฌํญ์ด ์์ ๋๋ ์ฝ๊ฒ ์ฐพ์์ ์์ ํ ์ ์๋ค. ๊ทธ๋์ ์์ ๋จ์๋ก ์์ ฏ์ ๋ง๋๋ ๊ฒ์ ์ถ์ฒํ๋ค !!)
๋ฌผ๋ก Flutter์์๋ ์์ ฏ์ extract ํ๊ธฐ ์ํ ๋๊ตฌ๊ฐ ์์ง๋ง, ์์ ฏ์ ์ฌ์ฉํ๊ธฐ ์ ์ extract๋๋์ฝ๋๊ฐ ํ์ํ ๊ฒ์๋ง ์ ๊ทผํ๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ค. ์ฐ๋ฆฌ ์ฝ๋๋ฅผ ์๋ก ๋ณด๋ฉด, ํ์ฌ appState์ ์ ์ํ์ง๋ง, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ ๋ณด๋ ํ์ฌ ๋จ์ด ์๋ง ์๋ฉด ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ์ด์ MyHomePage ์์ ฏ์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ๋ณด์..!!
lib/main.dart
// ...
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var appState = context.watch<MyAppState>();
var pair = appState.current; // ← Add this.
return Scaffold(
body: Column(
children: [
Text('A random AWESOME idea:'),
Text(pair.asLowerCase), // ← Change to this.
ElevatedButton(
onPressed: () {
appState.getNext();
},
child: Text('Next'),
),
], // ← 7
),
);
}
}
// ...
์ด์ Text ์์ ฏ์ ๋์ด์ appState ๋ฅผ ์ธ๊ธํ์ง ์์๋ ๋๋ค.
๊ทธ๋ฆฌ๊ตฌ, ์ด์ Refactor ๋ฉ๋ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด ์์ ฏ extract๋ฅผ ํด๋ณผ ๊ฒ์ด๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. refactor ํ๊ณ ์ถ์ ์์ ฏ์์ ์ฐํด๋ฆญ -> Refactor ๋ฉ๋ด๋ฅผ ์ ํ -> "BigCard " ์
๋ ฅ -> ์ํฐ
2. Move your cursor to the piece code you want to refactor (Text, in this case), and press Ctrl+. (Win/Linux) or Cmd+. (Mac). (๋๋ง ํท๊ฐ๋ ธ๋.. Cmd๋ .์ ๊ฐ์ด ๋๋ฅด๋ฉด ๋๋ค..!!!)
์ดํ ๋ฐฉ๋ฒ์ ์ ์์์ ๋ฐ๋ผํ๋ฉด ๋๋ค !
์ด์ฒ๋ผ extract widget ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฐ๋ผํ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ํ๋ ์์ฑ๋์์ ํ์ธํ ์ ์๋ค !
// ...
class BigCard extends StatelessWidget {
const BigCard({
Key? key,
required this.pair,
}) : super(key: key);
final WordPair pair;
@override
Widget build(BuildContext context) {
return Text(pair.asLowerCase);
}
}
// ...
์ด์ ์ด refactoring์ ํตํด ์ฑ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ธํด๋ณผ ๊ฒ์ด๋ค.
Add a Card
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ชฉํ๋ผ๊ณ ํ๋ ๊ทธ ํ๋ฉด์ ๊ธฐ์ต ํ๋๊ฐ...?
์ฐ๋ฆฌ์ ๋ชฉํ !!
์ด ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด vastweb์ด ํ๋์ ์นด๋ ์์ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ ์นด๋๋ฅผ ๋ง๋ค์ด๋ณผ ๊ฒ์ด๋ค !
์๊น ์ฌ์ฉํ๋ refactor ๋ฉ๋ด๋ฅผ ์ด์ฉํ ๊ฒ์ธ๋ฐ, ์ด๋ฒ์๋ extract ํ์ง ์๊ณ , Wrap with Padding ์ ํด๋ณผ ๊ฒ์ด๋ค.
์์์ ์ธ๊ธํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ๋ณด๋ค ๋ด๊ฐ ์์ฃผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๊น ์ธ๊ธํด๋ณด๋ ค ํ๋ค.
refactor ๋ฉ๋ด๋ฅผ ๋ถ๋ฌ์ค๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ vscode ์ข์ธก์ ์๋ ์ ๊ตฌ ์์ด์ฝ์ ๋๋ฅด๋ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์ ๊ตฌ ์์ด์ฝ -> Wrap with Padding ์ ์ ํํ๋ฉด, ์๋์ผ๋ก Padding์ด ์์ ฏ์ ๊ฐ์ธ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , Padding ํฌ๊ธฐ๋ฅผ 8.0 -> 20 ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
์ด์ , ์์์ ๋ง๋ Padding ์์ ฏ์ Card ์์ ฏ์ผ๋ก ๊ฐ์ธ์ค ๊ฒ์ด๋ค. ์ฆ, Padding ์์ ฏ์ ์์ ์์ ฏ์ผ๋ก Card ์์ ฏ์ ๋ง๋๋ ๊ฒ์ด๋ค.
padding ์์ ์๋ ์ ๊ตฌ ์์ด์ฝ์ ๋๋ฌ์ (์์์ ์ธ๊ธํ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํด๋ ๋๋ค.) Wrap with widget... ์ ์ ํํ๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ง๋ค์ด์ง widget ํ
์คํธ๋ฅผ ์ง์ฐ๊ณ , Card๋ฅผ ์
๋ ฅํ๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋นจ๊ฐ ์ค๋ ์ฌ๋ผ์ง ๊ฒ์ด๋ค !
์ค๊ฐ์ ๊ฒ์ ํด๋ณด์..!
์ฌ๊ธฐ๊น์ง ์ ๋ฐ๋ผ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
Theme and style
์ด์ ์นด๋ ์์ ๋ฐ๊ฟ์ค ๊ฑด๋ฐ, ์ผ๊ด๋ ์ ๊ตฌ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ข๊ธฐ ๋๋ฌธ์, ์ฑ์ ํ
๋ง๋ฅผ ์ฌ์ฉํด์ ์์ ์ ํํ ๊ฒ์ด๋ค.
main.dart์์ BigCard ํด๋์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ๋ค.
lib/main.dart
// ...
@override
Widget build(BuildContext context) {
var theme = Theme.of(context); // ← Add this.
return Card(
color: theme.colorScheme.primary, // ← And also this.
child: Padding(
padding: const EdgeInsets.all(20),
child: Text(pair.asLowerCase),
),
);
}
// ...
์ด๋ ๊ฒ ์์์ ์ถ๊ฐํ ๋ ์ฝ๋๋ ๊ต์ฅํ ๋ง์ ์ผ์ ํ๋ค.
๋จผ์ , ์ฒซ๋ฒ์งธ ์ฝ๋๋ ์ฑ์ ํ์ฌ ํ
๋ง๋ฅผ Theme.of(context)๋ก ๋ถ๋ฌ์จ๋ค.
๋ ๋ฒ์งธ ์ฝ๋๋ ํ
๋ง์ colorScheme ์์ฑ๊ณผ ๋์ผํ๊ฒ ์นด๋์ ์์์ ์ ์ํ๋ค.
์ ๊ตฌ์ฑํ๋ ๋ง์ ์์ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๊ธฐ๋ณธ ์์ ์ฑ์ primary color(์ฑ์ ์ ์ํ๋)์ด๋ค.
์ฆ, ์ฐ๋ฆฌ๋ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ MyApp ํด๋์ค์์ ์ ์ํ theme color ๋ฅผ ๋ถ๋ฌ์จ ๊ฒ์ด๋ค.
๋ง์ฝ, ์์ seedColor๋ฅผ ๋ฐ๊พธ๋ฉด, ํด๋น ์นด๋์ ์๋ ๊ฐ์ด ๋ฐ๋๊ฒ ๋๋ค.
์ด๋ ๊ฒ theme color๋ฅผ ์ฌ์ฉํ๋ฉด, ์ฑ์ ์ ์ฒด์ ์ธ ๋ฉ์ธ ์์ ๋ฐ๊ฟ์ผ ํ ๋, ๊ทธ ์์ด ์ฌ์ฉ๋ ์ฝ๋๋ฅผ ํ๋์ฉ ์ฐพ์ง ์๊ณ , MyApp์ theme์์ ์๋ง ๋ฐ๊ฟ์ฃผ๋ฉด, ๋ชจ๋ ๋ฐ๋๊ฒ ๋๋ค.
TextTheme
์ง๊ธ๊น์ง ์์ฑํ ํ๋ฉด์ ๋ณด๋ฉด ์ด๋ฌํ๋ค.
ํ์ง๋ง, ์นด๋ ์์ ์๋ ๊ธ์จ๊ฐ ๊ฒ์์์ด๋ฉฐ, ํฌ๊ธฐ๊ฐ ๋๋ฌด ์์ ์ฝ๊ธฐ ํ๋ค๋ค.
์ด์ BigCard ์ build() ๋ฉ์๋๋ฅผ ๊ณ ์ณ์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณผ ๊ฒ์ด๋ค.
๋ค์๊ณผ ๊ฐ์ด BigCard ์ ์ฝ๋๋ฅผ ์์ ํด๋ณด์
lib/main.dart
// ...
@override
Widget build(BuildContext context) {
var theme = Theme.of(context);
// ↓ Add this.
var style = theme.textTheme.displayMedium!.copyWith(
color: theme.colorScheme.onPrimary,
);
return Card(
color: theme.colorScheme.primary,
child: Padding(
padding: const EdgeInsets.all(20),
// ↓ Change this line.
child: Text(pair.asLowerCase, style: style),
),
);
}
// ...
theme.textTheme ์ ์ฌ์ฉํจ์ผ๋ก์จ app์ font theme์ ์ ๊ทผํ ์ ์๋ค. ์ด ํด๋์ค๋ bodyMedium (medium size์ ํ
์คํธ๋ฅผ ์ํ), caption (์ด๋ฏธ์ง๋ฅผ ์ํ), headlineLarge (large headlines๋ฅผ ์ํ)๊ณผ ๊ฐ์ ์์ฑ๋ค์ ํฌํจํ๊ณ ์๋ค.
displayMedium property๋ ๊ณต์ ๋ฌธ์์, "์งง๊ณ ์ค์ํ ํ
์คํธ๋ฅผ ์ฌ์ฉํ ๋" ๋ผ๊ณ ๋์์๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๊ฐ๋ค !
displayMedium ๋ ์ด๋ก ์ ์ผ๋ก null์ด ๋ ์ ์๋ค. ํ์ง๋ง Dart๋ null-safe์ด๊ธฐ ๋๋ฌธ์ null์ด ๋๋๋ก ๋ด๋ฒ๋ ค๋์ง ์๋๋ค.. ๊ทธ๋์, ์ด๋ฐ ๊ฒฝ์ฐ์๋ ! ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ์ฐ๋ฆฌ๊ฐ ๋ญ ํ๊ณ ์ถ์์ง Dart๊ฐ ์ ์ ์๋๋ก ํด์ผ ํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๊ฒ์ ์ด ๊ฒฝ์ฐ์ ํด๋นํ์ง ์๋๋น..ใ
ใ
displayMedium ์ copyWith() ๋ฅผ ํธ์ถํ๋ฉด, ์ฐ๋ฆฌ๊ฐ ์ ์ํ ์์ ์ฌํญ๊ณผ ํจ๊ป ํ
์คํธ ์คํ์ผ์ ๋ณต์ฌ๋ณธ์ด return ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด๋ฉด, ์ฐ๋ฆฌ๋ ํ
์คํธ ์์๋ง ๋ณ๊ฒฝํ ๊ฒ์ด๋ค.
๋ ๋ค๋ฅธ ์๋ก์ด ์์์ ์ป๊ณ ์ถ๋ค๋ฉด, ์ฑ์ ํ
๋ง์ ๋ค์ ์ ๊ทผํ๋ฉด ๋๋ค.
์ง๊ธ๊น์ง ํ ๊ฒฐ๊ณผ์ด๋ค..!!
ํ... step 5... ์๊ฐ๋ณด๋ค ๊ธธ๋ค.....
ํ์ง๋ง...! ๋ฒ์จ 50%๋ ํ์ผ๋.. ๊ด์ฐฎ๋ค....!!!!!!
๊ณ์ ๊ฐ๋ณด์๊ตฌ...
Improve accessibility
flutter๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ์ ์์ธ์ค ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด์, flutter ์ฑ์ ์ฑ์ ๋ชจ๋ ํ
์คํธ๋ค์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํด์ TalkBack ๋ฐ VoiceOver์ ๊ฐ์ ๊ฒ๋ค์ด ์ ๊ทผํ ์ ์๋ค.
pair.asLowerCase๋ณด๋ค๋ upper camel case๊ฐ screen reader๊ฐ ์ ํํ๊ฒ ๋จ์ด๋ฅผ ์ธ์ํ๋ ๊ฒ์ ๋์์ด ๋ ์ ์๋ค.
์์ธํ ๋ถ๋ถ์ ์ฝ๋๋ฉ์ ๋ณด์๊ธธ...... (์ ๋ ๊ท์ฐฎ์์ ์๋ตํ๋๊ฒ ๋ง์ต๋๋ค..ใ
ใ
)
๊ทธ๋์..! ๊ฒฐ๊ตญ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํด๋ณด์.
๊ทธ๋ฌ๋ฉด, ์ด์ screen readers๊ฐ ๋ช
ํํ๊ฒ ๊ฐ ๋จ์ด ์๋ค์ ์ฝ์ ์ ์๋ค. (๋ฌผ๋ก , UI์๋ ๋ณํ๊ฐ ์์ ๊ฒ์ด๋ค!)
// ...
@override
Widget build(BuildContext context) {
var theme = Theme.of(context);
var style = theme.textTheme.displayMedium!.copyWith(
color: theme.colorScheme.onPrimary,
);
return Card(
color: theme.colorScheme.primary,
child: Padding(
padding: const EdgeInsets.all(20),
// ↓ Make the following change.
child: Text(
pair.asLowerCase,
style: style,
semanticsLabel: pair.asPascalCase,
),
),
);
}
// ...
๋ณํ๋ฅผ ํ์ธํ๊ณ ์ถ๋ค๋ฉด, screen reader๋ฅผ ์ง์ ์ฌ์ฉํด๋ณด์๊ธธ...!!
Center the UI
์ด์ ..!! UI์ ์ผํฐ๋ฅผ ๋ง์ถฐ์ ์๊ฐ์ ์ธ ๋ถํธํจ์ ํด์ํด ๋ณผ ๊ฒ์ด๋ค.
๋จผ์ , BigCard ๋ Column์ ๋ถ๋ถ์์ ๊ธฐ์ตํด์ผ ํ๋ค. Column์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์๋ค์ top์ผ๋ก ํ๋ฒ์ ๋์ง๋ฉด, ์ด๋ฅผ ์ฝ๊ฒ override ํ ์ ์๋ค.
MyHomePage ์ build() ๋ฉ์๋๋ก ๊ฐ์, ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ๋ณด์..!
// ...
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var appState = context.watch<MyAppState>();
var pair = appState.current;
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center, // ← Add this.
children: [
Text('A random AWESOME idea:'),
BigCard(pair: pair),
ElevatedButton(
onPressed: () {
appState.getNext();
},
child: Text('Next'),
),
],
),
);
}
}
// ...
์ด๋ ๊ฒ ํ๋ฉด, Column ์์ ์๋ children๋ค์ด main(vertical=์์ง) axis์ ๋ง์ถฐ center๊ฐ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ์ค Column ์์ ์๋ children๋ค์ ์ด๋ฏธ main axis ๋ฐฉํฅ์ center๊ฐ ๋ง์ถฐ์ ธ ์๋ค. ์ฆ, ๊ฐ๋ก ์ผํฐ๋ก ์ค์ ๋์ด ์๋๋ฐ, ์ ์ฉ๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
๊ทธ ์ด์ ๋, Column ์์ฒด๊ฐ ์ผํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์, Column์ ์ผํฐ๋ฅผ ๋ง์ถฐ์ฃผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ผํฐ ์์น๋ก ๋ ์ ์๋ค.
Column์์ ์ ๊ตฌ ์์ด์ฝ ์ ๋๋ฅด๊ฑฐ๋, cmd . ๋๋ ctrl . ์ ๋๋ฌ Refactor menu๋ฅผ ์ด์ด์ค๋ค.
Refactor menu -> Wrap with Center
๊ทธ ๊ฒฐ๊ณผ, ํ๋ฉด์ ์ผํฐ์ ์์นํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค !!!
์ด์ ์กฐ๊ธ ๋ํ
์ผ์ ์ธ UI๋ฅผ ์์ ํ ์ฐจ๋ก์ด๋ค.
์ผ๋จ, ์นด๋ ์์ ์๋ "A random AWESOME idea:" ํ
์คํธ๋ ์์ ๋ ๋๋ฏ๋ก ์ง์์ฃผ๊ฒ ๋ค.
์นด๋์ "Next" ๋ฒํผ ์ฌ์ด์ ์ฌ๋ฐฑ์ด ์์ผ๋ฉด ๋ ์ข์ ๊ฒ ๊ฐ์ผ๋ฏ๋ก, SizedBox ์์ ฏ์ ์ฌ์ฉํด์ ๋ ์์ ฏ ์ฌ์ด์ '๊ณต๊ฐ'์ ๋ง๋ค์ด์ค๋ค
MyHomePage์์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ ํ๋ฉด ๋๋ค.
lib/main.dart
// ...
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var appState = context.watch<MyAppState>();
var pair = appState.current;
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
BigCard(pair: pair),
SizedBox(height: 10),
ElevatedButton(
onPressed: () {
appState.getNext();
},
child: Text('Next'),
),
],
),
),
);
}
}
// ...
์ด์ , ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ฒ์์ ๋ชฉํํ ์ด๋ฏธ์ง์ ์ผ์นํ๋ค !!!!!
์ด๋ ๊ฒ.. ๊ธธ์๋ step5๊ฐ ๋๋ฌ๋ค..!!!
๊ทธ์ ๋ณด๊ณ ๋ง๋ค๊ธฐ๋ง ํ๋ค๋ฉด, ๋นจ๋ฆฌ ๋๋ฌ์ํ
์ง๋ง, ์ดํดํ๊ณ , ์ด๋ฅผ ์ ๋ฆฌํ๋ค๋ณด๋ ๊ต์ฅํ ๊ธธ๊ฒ ๋๊ปด์ก๋ค...
๊ทธ๋ง ์ ๊ณ ์ถ์ ์๊ฐ๋ ๋ง์ด ์์์ง๋ง...!!!!
๊ทธ๋๋ step 5 ๋ !!
์์ฐธ! ํน์ ๋ชฐ๋ผ ํ์ํ ์ฌ๋๋ค์ ์ํ ์ ์ฒด ์ฝ๋...!!
lib/main.dart
import 'package:english_words/english_words.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => MyAppState(),
child: MaterialApp(
title: 'Namer App',
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),
),
home: MyHomePage(),
),
);
}
}
class MyAppState extends ChangeNotifier {
var current = WordPair.random();
void getNext() {
current = WordPair.random();
notifyListeners();
}
}
// ...
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var appState = context.watch<MyAppState>();
var pair = appState.current;
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
BigCard(pair: pair),
SizedBox(height: 10),
ElevatedButton(
onPressed: () {
appState.getNext();
},
child: Text('Next'),
),
],
),
),
);
}
}
class BigCard extends StatelessWidget {
const BigCard({
Key? key,
required this.pair,
}) : super(key: key);
final WordPair pair;
@override
Widget build(BuildContext context) {
var theme = Theme.of(context);
var style = theme.textTheme.displayMedium!.copyWith(
color: theme.colorScheme.onPrimary,
);
return Card(
color: theme.colorScheme.primary,
child: Padding(
padding: const EdgeInsets.all(20),
// ↓ Make the following change.
child: Text(
pair.asLowerCase,
style: style,
semanticsLabel: pair.asPascalCase,
),
),
);
}
}
// ...