1. Introduction
ํ์ตํ ๋ด์ฉ์!
โ flutter๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๊ธฐ์ด
โ flutter์์ layout ๋ง๋ค๊ธฐ
โ ์ฑ ๋์๊ณผ user interaction์ ์ฐ๊ฒฐ (์ข์์ ๋ฒํผ ๋๋ฅด๋ ๊ฒ์ด ๊ทธ ์)
โ flutter ์ฝ๋๋ฅผ ์ ๊ฐํ๊ฒ ์ง๋ ๊ฒ
โ ๋ฐ์ํ ์ฑ์ ๋ง๋๋ ๊ฒ (screen ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ๊ฒ ๋ฐ์ํ ์ ์์ !)
โ ์ฑ์ ์ผ๊ด๋ ํํ์ ๋๋์ ์ฃผ๋๋ก
2. Set up your Flutter environment (flutter ํ๊ฒฝ ์ค์ )
๐ Visual Studio Code ์ฌ์ฉ
codelab ๊ณต์ ๋ฌธ์์์ vscode๋ฅผ ๋ค์ด๋ฐ์ ์ ์๋๋ก ์ฐ๊ฒฐํด๋์๋ค!
๊ณต์๋ฌธ์ ๋งํฌ โฌ๏ธ
https://codelabs.developers.google.com/codelabs/flutter-codelab-first#1
๊ฐ๋ฐ ํ๊น ์ค์ ํ๊ธฐ (๋ค์ ์ค ์ํ๋ os๋ฅผ ์ ํํ๋ฉด ๋๋ค.)
flutter์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด์ ํน์ง์ธ ๋ถ๋ถ์ด๋ค.
multi-platform toolkit์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ฝ๋๋ก ์๋ก ๋ค๋ฅธ os๋ฅผ ์คํํ ์ ์๋ค.
os๋ ์ฃผ๋ก ๊ฐ๋ฐํ๊ณ ์ถ์ os๋ฅผ ์ ํํ๋ฉด ๋๋ค.
- iOS
- Android
- Windows
- macOS
- Linux
- web
์ด๋ ์ง์ ๊ธฐ๊ธฐ๋ฅผ ์ฐ๊ฒฐํด์ ์ฌ์ฉํด๋ ๋๊ณ , simulator๋ฅผ ํตํด ๊ฐ๋ฐํด๋ ๋๋ค.
(๋๋ ์ฝ 80%๋ฅผ simulator๋ก ๊ฐ๋ฐํ๋ค!)
Flutter ์ค์นํ๊ธฐ
Flutter SDK ์ค์น๋ ๋ค์ ๊ณต์ ๋ฌธ์์ ์์ธํ๊ฒ ์ค๋ช ๋์ด ์๋ค.
codelab์ ์งํํ๊ธฐ ์ํด์๋ ๋ค์์ 3๊ฐ์ง๋ง ์์ผ๋ฉด ๋๋ค.
1. Flutter SDK
2. Visual Studio Code (Flutter plugin์ด ์ค์น๋)
3. ๊ฐ๋ฐ ํ๊น์ ์๊ตฌ๋๋ software (์๋ฅผ ๋ค์ด, Visual Studio Code๋ Windows, Xcode๋ macOS)
(์ด ์ธ์, flutter SDK ์ค์น๋ ํ๊ฒฝ ์ค์ ์ ์ด๋ ค์์ด ์๋ค๋ฉด, codelab 2๋จ๊ณ์์ ๋ณด์ฌ์ฃผ๋ StackOverflow๋ฅผ ์ฐธ๊ณ ํ๊ธธ !)
3. Create a project
- Visual Studio Code๋ฅผ ์คํํ๊ณ command palette๋ฅผ Open. ( F1 ๋๋ ctrl+Shift+P ๋๋ Shift+Cmd+P )
- "flutter new"๋ฅผ ์
๋ ฅํ๊ณ ๊ทธ ๊ฒฐ๊ณผ ๊ฒ์๋ Flutter: New Project ๋ฅผ ์ ํํ๋ค.
- ๋ง์ฝ flutter ํ๊ฒฝ ์ค์ ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ก๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ ๋จ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- Flutter: New Project ๋ฅผ ์ ํํ๊ณ Appliction์ ์ ํํ๋ค.
- ๋ค์์ผ๋ก ํด๋๋ฅผ ์์ฑํ๊ณ ์ ํ๋ ์์น์, ํ๋ก์ ํธ ์ด๋ฆ์ ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
- ๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ขฐ์ ๊ด๋ จํ ์ฐฝ์ด ๋ฌ๋ค๋ฉด Yes~~๋ฅผ ์ ํ !
์ฌ๊ธฐ๊น์ง ํ๋ค๋ฉด ์ด์ ๋ฐ๋ก Flutter ๊ฐ๋ฐ์ ์์ํ ์ ์๋ค !!
codelab์ ๋ฐ๋ผํ๊ธฐ ์ํด ์ฃ์ธก ์๋จ์ ์๋ ์์ด์ฝ์ ๋๋ฅด๊ณ , pubspec.yaml ํ์ผ์ ์ ํํ๋ค.
ํด๋น ํด๋์ ์๋ ๋ด์ฉ ์ค, ๊ฐ์ฅ ์ ๋ ์ค์ ์ ์ธํ ์ฝ๋๋ฅผ ๋ชจ๋ ์ง์ด ๋ค, ์ด ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ์ด์ค๋ค.
(name๊ณผ description๋ถ๋ถ์ ๊ทธ๋๋ก ๋๋ค !)
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.1+1
environment:
sdk: '>=2.18.4 <3.0.0'
dependencies:
flutter:
sdk: flutter
english_words: ^4.0.0
provider: ^6.0.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
์ด pubspec.yaml์ ์ฑ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ์ผ์ด๋ค. ์ด ์ฑ์ ํ์ฌ ๋ฒ์ , dependencies, assets ๋ฑ์ ์ ๋ณด๊ฐ ์๋ค.
- ๋ค์์ ๊ฐ์ ์์ด์ฝ ๋ด์ ์๋ analysis_options.yaml ํ์ผ์ ๋ฐ๊ฟ์ค๋ค.
- ์์ ์๋ ์ฝ๋๋ฅผ ๋ชจ๋ ์ง์ฐ๊ณ , ๋ค์ ์ฝ๋๋ฅผ ๋ถ์ฌ๋ฃ์ด์ค๋ค.
include: package:flutter_lints/flutter.yaml
linter:
rules:
prefer_const_constructors: false
prefer_final_fields: false
use_key_in_widget_constructors: false
prefer_const_literals_to_create_immutables: false
prefer_const_constructors_in_immutables: false
avoid_print: false
์ด ํ์ผ์ ์ผ๋ง๋ ์๊ฒฉํ๊ฒ ์ฐ๋ฆฌ๊ฐ ์ง ์ฝ๋๋ฅผ ๋ถ์ํด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค. ์ด ๋ถ๋ถ์ ์ธ์ ๋ ์ง ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ, ํ์ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ฒ์ ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ๋์ด๊ฐ์ค~ ํ๊ณ ์ด์ผ๊ธฐํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
- ๋ง์ง๋ง์ผ๋ก main.dart ํ์ผ์ ๋ฐ๊ฟ์ค๋ค. (์์น๋ 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();
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var appState = context.watch<MyAppState>();
return Scaffold(
body: Column(
children: [
Text('A random idea:'),
Text(appState.current.asLowerCase),
],
),
);
}
}
์ด์ ๋ชจ๋ setting์ด ๋๋ฌ๋ค !!!!
์ค์ !! ๐
๋ณธ๊ฒฉ์ ์ผ๋ก ๋ค์ํ ์์ ฏ๋ค์ ์ฌ์ฉํด์ ์ง์ ์ฝ๋๋ฅผ ์ง๋ณด์ !!
4. Add a button
์ด์ Next button์ ๋ง๋ค์ด๋ณด์ !
.
.
๊ทธ ์ ์ ์ฑ์ Launchํด๋ด์ผ ํ๋ค.
๋จผ์ lib/main.dart ๋ฅผ ์ด์ด target device๊ฐ ์ ํ๋์๋์ง ํ์ธํด๋ณธ๋ค.
vscode์ ์ฐ์ธก ํ๋จ์ ๋ณด๋ฉด ํ์ฌ ์ง์ ๋ target device๋ฅผ ํ์ธํ ์ ์๋ค. ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์ด๋ฅผ ํด๋ฆญํด์ ๋ฐ๊พธ๋ฉด ๋๋ค.
๋๋ ๊ธฐ์กด์ ์ฐ๊ฒฐํด๋ ๊ธฐ๊ธฐ๊ฐ ์์ด ๋ฐ๋ก ๊ทธ ๊ธฐ๊ธฐ๋ก ์ค์ ์ด ๋์ด์์๋ค. ๋งฅ์ด๋ผ๋ฉด ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ด์ด ios ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , android studio๋ฅผ ํตํด ์๋๋ก์ด๋ ๊ธฐ๊ธฐ๋ฅผ ๋ง๋ค์ด ์คํํ ์ ์๋ค.
๊ธฐ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ๋ค๋ฉด ! ํ ๋ฒ ์คํํด๋ณด์ !!
์ฐ์ธก ์๋จ์ ์๋ ์คํ๋ฒํผ์ ๋๋ฌ ์คํํ๋ฉด ๋๋ค!
๋ค์๊ณผ ๊ฐ์ด ๋จ๋ฉด ์์ฃผ์์ฃผ ์ ๋ฐ๋ผ์จ ๊ฒ์ด๋ค !!!!
๋ง์ฝ ์ฝ๋๋ฅผ ๋ฐ๊พธ์๋ค๋ฉด, Command+s ๋๋ Ctrl+s๋ฅผ ํ๋ฉด ๋ฐ๋ก๋ฐ๋ก ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ ์ง ์๋๋ค๋ฉด, ์ฝ๋๋ฉ์์ ์ ์ํ Hot Reload์ ๋ํ stack overflow๋ฅผ ์ฐธ๊ณ ํ๊ธธ !
์ด์ ์ง์ง ์ง์ง ์ง์ง ๋ฒํผ์ ๋ง๋ค์ด๋ณผ๊ฑฐ๋ค !!!
lib/main.dart
// ...
return Scaffold(
body: Column(
children: [
Text('A random AWESOME idea:'),
Text(appState.current.asLowerCase),
// ↓ Add this.
ElevatedButton(
onPressed: () {
print('button pressed!');
},
child: Text('Next'),
),
],
),
);
// ...
๋ค์๊ณผ ๊ฐ์ด scaffold ๋ด์ ์๋ Column์ ElevatedButton์ ์ถ๊ฐํด์ค๋ค.
์ด๋ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฝ์์ ๋ค์๊ณผ ๊ฐ์ด ๋จ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ main.dart๊ฐ ์ด๋ป๊ฒ ์คํ๋๋์ง๋ฅผ ์ดํดํด๋ณด์
lib/main.dart์ ๊ฐ์ฅ ์๋จ์์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค.
// ...
void main() {
runApp(MyApp());
}
// ...
์ฐ๋ฆฌ๋ main() ์ด๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ฐพ์ ์ ์๋๋ฐ, ์ด ํจ์ ๋ด์ ์๋ ์ฝ๋๋ MyApp์ ์ ์๋ ์ฑ์ ์คํํ๋๋ก Flutter์ ์๋ ค์ฃผ๋ ๊ฒ์ด๋ค.
MyApp ํด๋์ค๋ StatelessWidget์ ํ์ฅํ๋ค. ์์ ฏ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ชจ๋ flutter app์ ์์๋ค์ธ๋ฐ, ์ฑ ๊ทธ ์์ฒด๋ ์์ ฏ์ด๋ค.
MyApp์ ์๋ ์ฝ๋๋ ์ ์ฒด ์ฑ์ ๊ตฌ์ฑํ๋ค. ์ด๋ app-wide state(๋์ค์ ๋ค๋ฃฐ ์์ !) ๋ฅผ ์์ฑํ๊ณ , ์ฑ์ ์ด๋ฆ์ ์ง๊ณ , ์๊ฐ์ theme์ ์ ์ํ๊ณ , "home" ์์ ฏ(๊ทธ๋ฌ๋๊น, ์ฑ์ ์์ ์ง์ )์ ์ค์ ํ ์ ์๋ค.
lib/main.dart
// ...
class MyAppState extends ChangeNotifier {
var current = WordPair.random();
}
// ...
flutter์๋ app state๋ฅผ ๊ด๋ฆฌํ๋ ๋ง์ ๋ฐฉ๋ฒ๋ค์ด ์๋ค. ๊ฐ์ฅ ์ฝ๊ฒ ์ด์ผ๊ธฐํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ChangeNotifier์ด๋ค.
MyAppState๋ function์ ์ฑ์ด ํ์๋ก ํ๋ data๋ฅผ ์ ์ํ๋ค.
- state class๋ ๋ณํ๋ฅผ ์๋ฆฌ๋ ChangeNotifier๋ฅผ ํ์ฅํ๋ค. ์๋ฅผ ๋ค์ด, ๋ง์ฝ ํ์ฌ ๋จ์ด๊ฐ ๋ฐ๋์๋ค๋ฉด, ์ฑ์ ์๋ ์ด๋ค ์์ ฏ์ด ์ด๋ฅผ ์ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค.
- MyApp์ ์ฌ์ฉํ๋ฏ์ด, ChangeNotifierProvider๋ฅผ ์ฌ์ฉํด์ ์ํ๋ฅผ ์์ฑํ๊ณ , ์ฑ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ ์ฑ์ ์๋ ์ด๋ค ์์ ฏ์ด๋ผ๋ ์ด ์ํ๋ฅผ ์ ์ ์๊ฒ ํ๋ค.
- ์ฆ, ์ฝ๊ฒ ์ด์ผ๊ธฐํ๋ฉด ChangeNotifier๋ฅผ MyAppState์ ์ฌ์ฉํ๋ฉด, ์ฑ์์ ๋ฐ์ํ๋ ๋ณํ๋ค์ ๋ค๋ฅธ ์์ ฏ๋ค์ด ์ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- MyApp์ด ๊ฐ์ฅ ์์ ์์ ฏ์ด๋ฉฐ, ChangeNotifier๋ ๋ณํ๋ฅผ ์ธ์งํ๊ณ ์ด๋ฅผ ์์ ฏ์ ์๋ฆฌ๋ ์ญํ ์์ ์ดํดํ๋ฉด ๋ ์ฝ๋ค
๋ง์ง๋ง์ผ๋ก MyHomePage์ ๋ํด ์์๋ณด์.
์ด ์์ ฏ์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์์ ํ ์์ ฏ์ด๋ค. ๊ณต์๋ฌธ์์์ ์ค๋ช ํ ๋ด์ฉ์ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ์กฐ๊ธ ์ฝ๊ฒ ์ค๋ช ํ ๊ฒ์ด๋ค.
// ...
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) { // ← 1
var appState = context.watch<MyAppState>(); // ← 2
return Scaffold( // ← 3
body: Column( // ← 4
children: [
Text('A random AWESOME idea:'), // ← 5
Text(appState.current.asLowerCase), // ← 6
ElevatedButton(
onPressed: () {
print('button pressed!');
},
child: Text('Next'),
),
], // ← 7
),
);
}
}
// ...
- ๋ชจ๋ ์์ ฏ์ ์์ ฏ์ ํ๊ฒฝ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋์ผ๋ก ํธ์ถ๋์ด ์์ ฏ์ด ํญ์ ์ต์ ์ํ๋ฅผ ๊ฐ๋๋ก ํ๋ build() method๋ฅผ ์ ์ํ๋ค.
- watch method๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ๋ณํ๋ฅผ ์ถ์ ํ๊ณ , ์ฑ์ ํ ์ํ๋ฅผ ์ ์งํ๋ค.
- ๋ชจ๋ build ๋ฉ์๋๋ ์์ ฏ ๋๋ ์ค์ฒฉ๋ ์์ ฏ ํธ๋ฆฌ๋ฅผ ๋ฐํํด์ผ ํ๋๋ฐ, ์ด ๊ฒฝ์ฐ ์ต์์ ์์ ฏ์ Scaffold์ด๋ค. Scaffold๋ ์ค์ ๋ก ๊ต์ฅํ ์์ฃผ ์ฌ์ฉ๋๋ฉฐ, main.dart์์ ๋ณผ ์ ์๋ฏ์ด, ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉ๋๋ค. return Scaffold();
- Column์ ์์ฃผ ์์ฃผ ์ฐ์ด๋ฉด์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ layout widget์ด๋ค. ์ด ์์ ฏ์ ๋ง์ ์์ children์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์์์๋ถํฐ ์๋๋ก ๋ฐฐ์นํ๋ค. default๋ก column์ ์ข์ธก ์๋จ๋ถํฐ ์์ํ๋๋ฐ, ์ด๋ฅผ center๋ก ๋ฐ๊ฟ์ค ์ ์๋ค. (๋ค์์ ๋ค๋ฃฐ ์์ )
- Text("")์ ํํ๋ก ์ฐ์ด๋ฉฐ, "" ์์ ์ํ๋ ๋ฌธ์์ด์ ๋ฃ์ผ๋ฉด ๊ทธ๋๋ก ํ๋ฉด์ ๊ทธ๋ ค์ง๋ค.
- ์ด Text ์์ ฏ์ appState๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด ํด๋์ค์ member์๋ง ์ ๊ทผํ ์ ์๋ค. (์ฌ๊ธฐ์์๋ current).
WordPair์ asPascalCase, asLowerCase ๋๋ asSnakeCase์ ๊ฐ์ด ์ ์ฉํ getter๋ฅผ ์ ๊ณตํ๋ค. - flutter์๋ ๊ดํธ๊ฐ ๊ต์ฅํ ๋ง์ด ์ฐ์ด๋๋ฐ, ์ผํ๋ ์ฌ์ฉํ์ง ์์๋ ๋๋ค. ํ์ง๋ง, vscode์์๋ ์ผํ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ถํ๊ธฐ ์ฝ๊ฒ ์๋์ ๋ ฌ์ด ๋๊ธฐ ๋๋ฌธ์ ์ ํ์ ๋ฐ๋ผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ๋ฐ, ์ฝ๋๊ฐ ๊ธธ์ด์ง๋๊ฒ ์ซ์ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ์๊ณ , ๊ตฌ๋ถ์ด ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ ํธ์ด๋ค.
์ง์ ํด๋ณด์
MyAppState๋ก ๊ฐ์ getNext method๋ฅผ ์ถ๊ฐํด๋ณด์.
lib/main.dart
// ...
class MyAppState extends ChangeNotifier {
var current = WordPair.random();
// ↓ Add this.
void getNext() {
current = WordPair.random();
notifyListeners();
}
}
// ...
getNext() ๋ฉ์๋๋ current์ ์๋ก์ด ๋๋ค WordPair๋ฅผ ์ฌํ ๋นํด์ค๋ค. ๋ํ ์ด๋ฅผ notifyListeners()๋ผ ๋ถ๋ฅด๋๋ฐ, (ChangeNotifier์ ๋ฉ์๋ ์ค ํ๋์ด๋ค.)์ด๋ MyAppState๋ฅผ ๋ณด๊ณ ์๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์๋ฆผ์ ์ค๋ค.
lib/main.dart
// ...
ElevatedButton(
onPressed: () {
appState.getNext(); // ← This instead of print().
},
child: Text('Next'),
),
// ...
์ด์ Next ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ๋จ์ด๊ฐ ๋ฐ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค !!!
์๊ฐ๋ณด๋ค ๋๋ฌด ๊ธธ์ด์ ธ์ ๋ค์ ๋จ๊ณ๋ ๋ค์ ๊ธ์ ์ ์ด์ผ๊ฒ ๋ค !!
ํ์ํ ์ฌ๋์ด ์์์ง ๋ชฐ๋ผ codelab์ step1~step4๊น์ง์ 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>();
return Scaffold(
body: Column(
children: [
Text('A random idea:'),
Text(appState.current.asLowerCase),
ElevatedButton(
onPressed: () {
appState.getNext(); // ← This instead of print().
},
child: Text('Next'),
),
],
),
);
}
}
'๐ง flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[flutter] ์๋กญ๊ฒ ๋ฐ๋ codelab (step6) (0) | 2023.02.09 |
---|---|
[flutter] ์๋กญ๊ฒ ๋ฐ๋ codelab (step5) (0) | 2023.02.08 |
์์ดํฐ ๋ฌด์ ๋๋ฒ๊น (0) | 2022.10.30 |
[Flutter] flutter iphone ์ฐ๋ํ๊ธฐ (2) | 2022.08.25 |
flutter album ์ ๊ทผ (0) | 2022.07.08 |