์ง๋ ์คํ ๊น์ง ์ ๋ฐ๋ผ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ชจ๋ ๋๋ผ๋ฏ, ํ์ฌ๋ ํจ๋ฉ๋ ๋ง์ง ์๊ณ , ์ฐ๋ฆฌ๊ฐ ์ค์ํ๊ฒ ๋ณด์ฌ์ค์ผ ํ ๋ฐ์ดํฐ์ธ word๊ฐ ํ ๋์ ๋ค์ด์ค์ง ์๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ๋๋ผ๊ธฐ์ ์กฐ๊ธ ๋ ์ฝ๊ฒ, ์ํ๋ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋๋ก ํด์ผํ๋ค.
๊ทธ๋์ ์ด๋ฒ ์คํ ์์๋ ์ด๋ฌํ ์๊ฐ์ ์ธ ์์(๋์์ธ) ์ ์กฐ๊ธ ์ ๊ฒฝ์ ์จ๋ณด๋ ค๊ณ ํ๋ค.
์ฝ๋๋ฉ์์ ์ ์ํ ๋ค์ ์ฐ๋ฆฌ์ ๋ชฉํ๋ ์ด ์ด๋ฏธ์ง์ ๊ฐ๋ค.
Extract a widget
ํ์ฌ ์ฐ๋ฆฌ ์ฝ๋์์๋ 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,
),
),
);
}
}
// ...
'๐ง flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[flutter] ์๋กญ๊ฒ ๋ฐ๋ codelab (step6) (0) | 2023.02.09 |
---|---|
[flutter] ์๋กญ๊ฒ ๋ฐ๋ codelab (step1-step4) (0) | 2023.02.07 |
์์ดํฐ ๋ฌด์ ๋๋ฒ๊น (0) | 2022.10.30 |
[Flutter] flutter iphone ์ฐ๋ํ๊ธฐ (2) | 2022.08.25 |
flutter album ์ ๊ทผ (0) | 2022.07.08 |