showDialog๋ฅผ ์ด์ฉํด AlertDialog๋ฅผ ์คํ์ํค๊ณ content์์ ๋ด์ฉ์ ๋ฃ์ ์ ์๋ค.
AlertDialog
alertDialog
title : ์ ๋ชฉ ์์ญ
content : ๋ด์ฉ ์์ญ
SingleChildScrollView, ListBody๋ฅผ ์ด์ฉํ๋ฉด ์คํฌ๋กค ๋์ ๊ฐ๋ฅ
action ํ๋กํผํฐ์๋ ๋ฒํผ ์ ์ฉ
Navigator.of(context).pop() : ๋ค์ด์ผ๋ก๊ทธ ๋ซ๊ธฐ
class _MyHomePageState extends State<MyHomePage> {
void FlutterDialog() {
showDialog(
context: context,
barrierDismissible: false, // ๋ฐ๊นฅ ์์ญ ํฐ์น์ ๋ซ์์ง ์ฌ๋ถ
builder: (BuildContext context) {
return AlertDialog(
title: Text('ํ์
๋ฉ์์ง'),
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
Text('Alert Dialog ํ
์คํธ'),
Text('ok ๋ฒํผ ํด๋ฆญํ์ธ์'),
],
),
),
actions: <Widget>[
FlatButton(
child: Text('ok'),
onPressed: () {
Navigator.of(context).pop();
},
),
FlatButton(
child: Text('cancel'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
}
);
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Column(
children: <Widget>[
RaisedButton(
child: Text('Alert Dialog test'),
onPressed: () => FlutterDialog(),
)
],
)
);
}
}

showDialog(
context: context,
builder: (context) => StatefulBuilder(builder: (context, setState) {
//Dialog์์ setState๋ฅผ ์ ์ฉํ๋ ค๋ฉด StateFulbuilder๋ฅผ ๊ผญ ์ ์ฉํด์ผ ํ๋ค.
return AlertDialog(
shape: RoundedRectangleBorder(
//ํ์
์ฐฝ์ radius๋ฅผ ์ฃผ๊ธฐ์ํ ์ต์
borderRadius: BorderRadius.all(Radius.circular(32.0))),
contentPadding: EdgeInsets.only(top: 0),
//default ํจ๋ฉ๊ฐ์ ์์จ ์ ์๋ค.
content:Container()
https://blog.codefactory.ai/flutter/form/


Transform.scale(
scale: 4.2 , //์๋ ์์ด์ฝ ์ฌ์ด์ฆ์ 4.2๋ฐฐ๋ก ํค์ฐ๊ธฐ
child: icon(icons.add), //์ฌ์ด์ฆ ๋ณ๊ฒฝํ ์์ ฏ ์์ฑ
) //์ฌ์ด์ฆ ์กฐ์ (container๋ณด๋ค ํฌ๊ฒ ์ค์ ํด๋ container์ ํฌ๊ธฐ๋ ๋ณํ์ง ์์)
Transform.translate(
offset: Offset(dx,dy), //x์ถ,y์ถ์ผ๋ก์ ์ด๋๊ฑฐ๋ฆฌ ์ค์
child: Text('Hello'), //offset๋งํผ ์ด๋์ํฌ ์์ ฏ ์์ฑ
) //์์น ์กฐ์
Transform.rotate(
angle: pi/4 , //45deg
child: , //๊ฐ๋ ๋ฐ๊ฟ ์์ ฏ ์์ฑ
) //๊ฐ๋ ์กฐ์
clipBehavior: Clip.hardEdge //css์ overflow์ ๋น์ทํ ์์ฑ
theme: ThemeData(
textTheme: const TextTheme(
titleLarge: TextStyle(
color: Colors.red,
),
),
),
Text('Hello, I am title',
style: TextStyle(
color: Theme.of(context).textTheme.titleLarge!.color,
), //context๋ ์ด์ ์ ์๋ ๋ชจ๋ ์์ ์์๋ค์ ๋ํ ์ ๋ณด์ด๋ค
), //dart๋ null safe์ธ์ด์ด๊ธฐ์ titleLarge๊ฐ null์ด ์๋์ ์๋ ค์ค์ผ ํ๋ค.
//?(๋ฌผ์ํ)๋ฅผ ์ฌ์ฉํด์ null์ด ์๋ ๊ฒฝ์ฐ์๋ง ์คํํ๋ผ๊ณ ์๋ ค์ค๋ ๋๋ค.

์์
์ด ์ค๋๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ, ํด๋น ์์
์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ํจ.
(API์ ์์ฒญ์ ํ๊ณ ๋ฐ๋ก ๋ค์ ์ฝ๋ ์์
์ผ๋ก ๋์ด๊ฐ๋ ๊ฒ์ด ์๋๋ผ, ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ฒฝ์ฐ)
๋ฆฌํดํ์ ํจ์๋ช () async {}
class ApiService {
final String baseUrl="https://webtoon-crawler.nomadcoders.workers.dev";
final String today="today";
void getTodaysToons() async { //๋น๋๊ธฐํจ์ async
final url=Uri.parse('$baseUrl/$today');
final response=await http.get(url); //getํจ์๋ httpํจํค์ง์ ์๋ ํจ์์ด๋ค.
//await์ ํตํด ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ตํ๋ฉด response๋ผ๋ ๋ณ์์๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
if(response.statusCode==200){ //์์ฒญ์ ์ฑ๊ณตํ๋ฉด
print(response.body); //์๋ฒ๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ ์ถ๋ ฅํ๊ธฐ
return;
}
throw Error();
}
final List<dynamic> webtoons=jsonDecode(response.body);
โก๏ธapi ๋ถ๋ฌ์ค๊ธฐ
class ApiService {
final String baseUrl="https://webtoon-crawler.nomadcoders.workers.dev";
final String today="today";
Future<List<WebtoonModel>> getTodaysToons() async {
//Future์ ๋น์ฅ ์๋ฃ๋ ์ ์๋ ์์
์ด ์๋์ ๋ปํจ
//๋น๋๊ธฐํจ์ async (์์
์ด ์ค๋๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ, ํด๋น ์์
์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ํจ)
List<WebtoonModel> webtoonInstances=[];
final url=Uri.parse('$baseUrl/$today');
//ํ๋ณํ ๋ฉ์๋ parse, toString, toList
final response=await http.get(url);
//url์ Uriํ์
์ด์ด์ผ ํ๋ค
//getํจ์๋ httpํจํค์ง์ ์๋ ํจ์
//Futureํ์
์ ๋ฐํํ๋ ํจ์
//await์ ํตํด ์๋ฒ๊ฐ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ตํ๋ฉด response๋ผ๋ ๋ณ์์๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
if(response.statusCode==200){ //http ์๋ต์ ์ํ์ฝ๋๋ก ํํ๋จ
//(200์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํํ์ ๋์ ์ํ ์ฝ๋)
final List<dynamic> webtoons=jsonDecode(response.body);
for (var webtoon in webtoons){
webtoonInstances.add(WebtoonModel.fromJson(webtoon));
}
return webtoonInstances;
}
throw Error();
}
}
class WebtoonModel {
final String title, thumb, id;
WebtoonModel.fromJson(Map<String, dynamic> json)
//Map์ ํค(Key)์ ๊ฐ(Value)๋ก ๊ตฌ์ฑ๋ ํด๋์ค
: title=json['title'],
thumb=json['thumb'],
id=json['id'];
//named Constructor
//์์ฑ์ ๋ด๋ถ์์ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ด๊ธฐํํ๋ ํน๋ณํ ๊ตฌ๋ฌธ์ผ๋ก ์์ฑ์์ ์ค๊ดํธ({}) ์ดํ์ ์์ฑ๋๋ค.
//Dart์์๋ json์ ๋ค๋ฃจ๊ธฐ ์ํด Map<String, dynamic> ์ด๋ผ๋ ์๋ฃํ์ ์ฌ์ฉํ๋ค.
//json ๋ฐ์ดํฐ๋ ํค์ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ ธ์๊ณ ํค๋ ๋ฐ๋์ String์ด๋ฉฐ ๊ฐ์ ์๋ฃํ์ด ์ ํด์ ธ์์ง ์๋ค.
//๋๋ฌธ์ Map<String, dynamic> ์๋ฃํ์ผ๋ก ๋ชจ๋ json ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ค. (json ์๋ฃํ)
200 ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ ์์ ์ผ๋ก ์ํํจ
201 ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ ํ ๋ฆฌ์์ค ์์ฑ์ ์์ฒญ, ํด๋น ๋ฆฌ์์ค๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋จ์ ์๋ฏธ
400 ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ถ์ ์ ํ ๋
401 ํด๋ผ์ด์ธํธ๊ฐ ์ธ์ฆ๋์ง ์์ ์ํ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋
403 ์ ์ ์ธ์ฆ์ํ์ ๊ด๊ณ์์ด ์๋ตํ๊ณ ์ถ์ง ์์ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋
405 ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉ๋ถ๊ฐ๋ฅํ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋(ex.๊ณ์ , ์ธ์ฆ๊ด๋ จ)
301 ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋ฆฌ์์ค์ ๋ํ URI๊ฐ ๋ณ๊ฒฝ๋์์๋
500 ์๋ฒ์ ๋ฌธ์ ๊ฐ ์์๊ฒฝ์ฐ