Udemy ๊ฐ์๋ฅผ ๋ฃ์ผ๋ฉด์ Flutter๋ฅผ ํ์ตํ๊ณ ์๋ค.
์ด๋ฒ ์ฃผ๋ Builder, Container, Column, Row, CrossAxisAlignment, ListView, Button ๋ฑ์ ํ์ฉํ์ฌ
๊ฐ๊ณ๋ถ ์ดํ์ ๋ง๋ค์๋ค. ์๋ ๋ง๋๋ ์ค์ด๋ค.
์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ AppBar ์ฐ์ธก ์๋จ๊ณผ ํ๋จ์ ๊ธฐ๋ก์ ์ถ๊ฐํ ์ ์๋ ๋ฒํผ์ด ์๊ณ
๋ฒํผ์ ํด๋ฆญํ๋ฉด ์๋ก์ด ์๋นํญ๋ชฉ์ ๋ฑ๋กํ ์ ์๋ค.
๋ํ AppBar ์๋์๋ 1์ฃผ์ผ ๊ฐ์ ์๋น ๊ธ์ก์ ํ ๋์ ํ์ธํ ์ ์๋ ์ฐจํธ๋ฅผ ๊ตฌํํ๊ณ ์๋ค.
์ด๋ฒ ์ดํ์ ์ ์ฒด์ ์ธ ์์ ฏ ํธ๋ฆฌ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
assets ํด๋์๋ ์ดํ์์ ์ฌ์ฉํ ํฐํธ์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋์ด์๋ค.
models์๋ ์๋นํญ๋ชฉ๊ณผ ๊ด๋ จ๋ ๋ณ์๊ฐ ์ ์ธ๋์ด์๊ณ ,
widgets์๋ ์๋นํญ๋ชฉ์ UI์ ํ์ํ ๋ฉ์๋๋ค์ด ์ ์ธ๋์ด์๋ค.
main์์๋ widgets์ ์ด์ฉํ์ฌ ์ต์ข ์ ์ผ๋ก ํ๋ฉด์ ํํํ๋ค.
์ฐ์ , models > transaction.dart ๋ฅผ ์ดํด๋ณด์.
import 'package:flutter/foundation.dart';
class Transaction {
final String id;
final String title;
final double amount;
final DateTime date;
Transaction({
required this.id,
required this.title,
required this.amount,
required this.date,
});
}
์์์ ๋งํ๋ฏ ์๋นํญ๋ชฉ์ ๊ด๋ จ๋ ๋ณ์๋ค์ด ์ ์ธ๋์ด์๋ค. ํด๋์ค ํ๋จ์ ์ฝ๋๋ ์์ฑ์์ด๋ค.
์ข ํน์ดํ๊ฒ ์๊ฒผ์ง๋ง id = this.id ์ด๋ฐ ์์ ํํ๋ฅผ ์์์ ์ ์ธ์ด๋ผ๊ณ ํ๋ค.
๋ ๋ฒ์งธ๋ widgets > new_transaction.dart ์ด๋ค.
ํ์ผ๋ช ์์ ๋ณผ ์ ์๋ฏ ์๋ก์ด ์๋นํญ๋ชฉ์ด ์ ๋ ฅ๋๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ค.
import 'package:flutter/material.dart';
class NewTransaction extends StatefulWidget {
final Function addTx;
NewTransaction(this.addTx);
@override
State<NewTransaction> createState() => _NewTransactionState();
}
class _NewTransactionState extends State<NewTransaction> {
final titleController = TextEditingController();
final amountController = TextEditingController();
void submitData(){
final enteredTitle = titleController.text;
final enteredAmount = double.parse(amountController.text);
if (enteredTitle.isEmpty || enteredAmount <=0) {
return;
}
widget.addTx(
enteredTitle,
enteredAmount,
);
Navigator.of(context).pop();
}
@override
Widget build(BuildContext context) {
return Card(
elevation: 5,
child: Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Title'),
// 1๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ 1์ค์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑ
// onChanged: (val) => titleInput = val,
controller: titleController,
onSubmitted: (_) => submitData,
),
TextField(
decoration: InputDecoration(labelText: 'Amount'),
// 1๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ 1์ค์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑ
// onChanged: (val) => amountInput = val,
controller: amountController,
onSubmitted: (_) => submitData,
),
FlatButton(
child: Text('Add Transaction'),
textColor: Colors.purple,
onPressed: submitData,
),
],
),
),
);
}
}
Flutter๋ฅผ ์ฒ์ ์ ํ๋ฉด ๊ฐ์ฅ ์ ๊ธฐํ ๊ฒ ์ค์ ํ๋๊ฐ StatefulWidget๊ณผ StatelessWidget์ด๋ค.
๋ญ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด ํด๋น ํด๋์ค์์ ๋ณ์์ ๋ณํ(?), ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ StatefulWidget์ด๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ StatelessWidget์ด๋ค.
์๋ฅผ ๋ค์ด while () => { i += 1 } ์ด๋ฐ ๊ฒฝ์ฐ๋ StatefulWidget์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ฌผ๋ก ์ด๋ ๊ฒ ๋จ์ํ๊ฒ ๋๋ ์ง๋ ๊ฒ์ ์๋์ง๋ง ๊น์ํ ๋ค์ด๊ฐ๋ฉด ๋จธ๋ฆฌ์ํ๋๊น...
์๋ฌดํผ ์๋ก์ด ์๋น ํญ๋ชฉ์ด ์ถ๊ฐ๋๋ ๊ณผ์ ์ด ์ผ์ด๋๋๊น ๊ฒฐ๊ตญ์ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์๋ ๊ฒ์ด๊ณ ,
๋ฐ๋ผ์ StatefulWidget์ผ๋ก ์ ์ธํด์คฌ๋ค.
์ด๋ ๊ฒ StatefulWidget์ผ๋ก ์ ์ธํ๋ฉด ์๋์ฒ๋ผ ํ๋์ ํด๋์ค๊ฐ ๋ฐ๋ผ์จ๋ค.
class NewTransaction extends StatefulWidget {
@override
State<StatefulWidget> createState() => _NewTransactionState();
}
class _NewTransactionState extends State<NewTransaction> {
}
์ด๊ฒ๋ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ์๋ฉด WidgetClass์์ createState๋ฅผ @override ํ์ฌ State Class๋ฅผ Link ํ๋ค๋ ๋ป์ด๋ค.
์ดํ WidgetClass์์ @override๋ฅผ ํตํด ์๋ก์ด ์๋นํญ๋ชฉ์ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ค.
@override
Widget build(BuildContext context) {
return Card(
elevation: 5,
child: Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Title'),
// 1๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ 1์ค์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑ
// onChanged: (val) => titleInput = val,
controller: titleController,
onSubmitted: (_) => submitData,
),
TextField(
decoration: InputDecoration(labelText: 'Amount'),
// 1๋ฒ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์๋ 1์ค์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑ
// onChanged: (val) => amountInput = val,
controller: amountController,
onSubmitted: (_) => submitData,
),
FlatButton(
child: Text('Add Transaction'),
textColor: Colors.purple,
onPressed: submitData,
),
],
),
),
);
}
js์ ๋น์ทํ ํํ๋ฅผ ๋๊ณ ์๋๋ฐ Flutter๋ Widget์ผ๋ก ์์ํด์ Widget์ผ๋ก ๋๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Widget์ ๊ดํด์ ์กฐ๊ธ ์ ๋ฆฌํด ๋์๊ฒ ์์ด์ ์ฒจ๋ถํ๋ค.
https://codekodo.notion.site/21-07-08-Flutter-Widget-2eac1931561e46f8857fc0d51792cc3c
์๋ฌดํผ Card > Container, Column > TextField ๋ฑ์ผ๋ก ๊ฐ ์์๋ค์ ๊ตฌํํ๋ค.
์ค๊ฐ์ child์ children์ด ์๋ ๊ฑธ ๋ณผ ์ ์๋๋ฐ ๋์ ์ฐจ์ด๋ ์์ด ๋จ์ด ๋ป์ด๋ ๋๊ฐ๋ค.
ํด๋น ๊ตฌ์กฐ์์ ์๋ ๊ฐ ํ ๋ช ์กด์ฌํ๋ ๊ฒฝ์ฐ child, ๋ ์ด์์ธ ๊ฒฝ์ฐ children์ผ๋ก ์ ์ธํ๋ค.
์ค์ ๋ก ์ฝ๋๋ฅผ ๋ณด๋ฉด Card์ child๋ Container 1๊ฐ, Container์ child๋ Column์ผ๋ก ๊ตฌํํ ๊ฒ์ ๋ณผ ์ ์๋ค.
Column์๋ ์๋นํญ๋ชฉ์์ ์ ํ๋ช ๊ณผ ๊ฐ๊ฒฉ ๊ทธ๋ฆฌ๊ณ ๋ฑ๋ก ๋ฒํผ, ์ด๋ ๊ฒ ์ด 3๊ฐ์ Layout์ด ํ์ํด์ Children์ผ๋ก ๊ตฌํํ๋ค.
์๋๋ ์ค์ ์ ๋ฎฌ๋ ์ดํฐ์์ ์ดํ์ ์บก์ณํ ๊ฒ์ด๋ค.
์ด๋ฒ ์ฃผ ๋ชจ๊ฐ์ฝ๋ ์ฌ๊ธฐ๊น์ง์๋ค.
์ด๋ฒ ์ฃผ๋ด๋ก ์ดํ ๊ตฌํ์ ๋ง๋ฌด๋ฆฌํ๊ณ ๋ค์ ์ฃผ ๋ชจ๊ฐ์ฝ ๋ ๋๋จธ์ง Widget์ ๋ํด ์ค๋ช ์ ํ๊ณ ์ดํ์ ๋ํ ๋ฆฌ๋ทฐ๋ฅผ ํด์ผ๊ฒ ๋ค.
'โน๏ธ ๋ผ์ดํ > 2021 ์ฌ๋ฆ๋ฐฉํ ๋ชจ๊ฐ์ฝ(๊ฐ์ธ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ ํ๊ตฌ๋ง 2] 6์ฃผ์ฐจ - Flutter : Shop App 3 (0) | 2021.08.10 |
---|---|
[์ฝ๋ ํ๊ตฌ๋ง 2] 5์ฃผ์ฐจ - Flutter : Shop App 2 (0) | 2021.08.10 |
[์ฝ๋ ํ๊ตฌ๋ง 2] 4์ฃผ์ฐจ - Flutter : Shop App 1 (0) | 2021.07.28 |
[์ฝ๋ ํ๊ตฌ๋ง 2] 3์ฃผ์ฐจ - Flutter : Personal Expense App (2) | 2021.07.22 |
[์ฝ๋ ํ๊ตฌ๋ง 2] 1์ฃผ์ฐจ - Flutter : Quiz App (0) | 2021.07.07 |