
Browse Fonts - Google Fonts
Making the web more beautiful, fast, and open through great typography
Ctrl + V
를 사용하여 붙여넣기를 하기 보다는 Shift + insert
를 사용하는 것이 좋다.
이유는 터미널은 GUI 환경과 달라서 Ctrl + V
가 동작하지 않을 수 있기 때문이다. 동작한다면 Ctrl + V
를 사용해도 무관하지만 습관을 터미널에서 Shift + insert
로 습관을 들이는 것이 더 좋다.pubspec.yaml
파일에 추가하기Pub get
클릭하여 라이브러리 다운 받기runApp
을 제외하고 모두 지운다. 현재 아래 코드와 같다면 MyApp
이 없기 때문에 오류가 날 것이다.import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
stl
자동완성기능을 이용하여 MyApp
만들기import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
MyApp({super.key});
@override
Widget build(BuildContext context) {
return Placeholder();
}
}
MaterialApp
을 선택
MyApp
클래스에서는 환경만을 세팅하기 때문에 직접적인 화면 구성은 home:
에서 할 것이다.import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ,
);
}
}
Scaffold
이다.
앱이 몇 페이지가 나올지는 모르지만, 굉장히 많은 페이지가 나올 것이다. 한 장의 도화지에 모든 위젯들을 그릴 수는 없기 때문에 각각 페이지 마다 도화지Scaffold
가 필요하다.import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(),
);
}
}
Appbar
를 쓰는 이유는 모바일 앱의 기본이 되는 상단 바로서 사용자들에게 익숙한 UI/UX를 제공해준다. 그리고 또한 커스터마이징이 쉬워서 개발자의 마음대로 바꿀 수 있다.Appbar
를 쓰는 것이 좋다.appBar
는 HTML header
와 매우 유사하다import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar()
),
);
}
}
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: Placeholder(),
),
);
}
}
Appbar
에 위젯을 배치하기 위해서는 우선적으로 Appbar
위젯의 구조를 알아야한다. 아래 사진을 참고하기 바란다.Icon
위젯은 Icon을 표시해주는 위젯이다. MaterialIcon
또는 CupertionIcon
중 원하는 Icon
을 사용할 수 있다. 플러터에서 제공하는 기본 Icon
이 아닌 다른 Icon
을 사용하고 싶다면 pub.dev
에서 원하는 Icon
라이브러리를 다운받아서 사용하면 된다.class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
actions: [
Icon(Icons.search),
Icon(CupertinoIcons.heart, color: Colors.redAccent),
],
),
body: Placeholder(),
),
);
}
}
Text(
'This is Google Fonts',
style: GoogleFonts.lato(),
),
Browse Fonts - Google Fonts
Making the web more beautiful, fast, and open through great typography
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: Text(
"Recipes",
style: TextStyle(fontSize: 30),
),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: Text(
"Recipes",
style: GoogleFonts.patuaOne(),
),
),
);
}
Text(
'This is Google Fonts',
style: GoogleFonts.lato(
textStyle: TextStyle(color: Colors.blue, letterSpacing: .5),
),
),
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: Column(
children: [
Text("Recipes", style: GoogleFonts.patuaOne(textStyle: TextStyle(fontSize: 30))),
Row(
children: [
MenuItem(),
MenuItem(),
MenuItem(),
MenuItem(),
],
),
],
),
),
);
}
class MenuItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: [
Icon(Icons.food_bank),
Text("ALL"),
],
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: Column(
children: [
Text("Recipes", style: GoogleFonts.patuaOne(textStyle: TextStyle(fontSize: 30))),
Row(
children: [
MenuItem(Icons.food_bank, "ALL"),
MenuItem(Icons.emoji_food_beverage, "Coffee"),
MenuItem(Icons.fastfood, "Burger"),
MenuItem(Icons.local_pizza, "Pizza"),
],
),
],
),
),
);
}
class MenuItem extends StatelessWidget {
IconData mIcon;
var mText;
MenuItem(this.mIcon, this.mText);
@override
Widget build(BuildContext context) {
return Column(
children: [Icon(mIcon), Text(mText)],
);
}
}
_
가 들어가야 한다는 것이다. _
의 뜻은 JAVA에서는 private
으로 다른 클래스에서 접근을 못하게 끔 만드는 것이다._
, 모두 소문자import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: ListView(
children: [
Text("Recipes"),
],
),
),
);
}
AppBar _appbar() {
return AppBar(
actions: [
Icon(Icons.search),
Icon(CupertinoIcons.heart, color: Colors.redAccent),
],
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: ListView(
children: [
Text("Recipes"),
Row(
children: [
Column(children: [Icon(Icons.food_bank), Text("ALL")]),
Column(children: [Icon(Icons.emoji_food_beverage), Text("Coffee")]),
Column(children: [Icon(Icons.fastfood), Text("Burger")]),
Column(children: [Icon(Icons.local_pizza), Text("Pizza")]),
],
),
],
),
),
);
}
$[변수]
이렇게 써도 되고, ${ [변수] }
이렇게 써도 된다. 하지만 만약 연산이 필요한 경우에는 무조건 {}
가 필요하다. 예시로는 ${ [변수]+1}
가 있다.class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: ListView(
children: [
Text("Recipes", style: GoogleFonts.patuaOne(textStyle: TextStyle(fontSize: 30))),
Row(
children: [
MenuItem(Icons.food_bank, "ALL"),
MenuItem(Icons.emoji_food_beverage, "Coffee"),
MenuItem(Icons.fastfood, "Burger"),
MenuItem(Icons.local_pizza, "Pizza"),
],
),
ListItem("coffee"),
ListItem("burger"),
ListItem("pizza"),
],
),
),
);
}
class ListItem extends StatelessWidget {
var title;
ListItem(this.title);
@override
Widget build(BuildContext context) {
return Column(
children: [
Image.asset("assets/$title.jpeg"),
Text("$title"),
Text("Have you ever made your own $title? Once you've tried a homemade $title, you'll never go back."),
],
);
}
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: _appbar(),
body: ListView(
children: [
Text("Recipes", style: GoogleFonts.patuaOne(textStyle: TextStyle(fontSize: 30))),
Row(
children: [
MenuItem(Icons.food_bank, "ALL"),
MenuItem(Icons.emoji_food_beverage, "Coffee"),
MenuItem(Icons.fastfood, "Burger"),
MenuItem(Icons.local_pizza, "Pizza"),
],
),
ListItem("coffee"),
ListItem("burger"),
ListItem("pizza"),
],
),
),
);
}
AppBar _appbar() {
return AppBar(
actions: [
Icon(Icons.search),
Icon(CupertinoIcons.heart, color: Colors.redAccent),
],
);
}
}
class ListItem extends StatelessWidget {
var title;
ListItem(this.title);
@override
Widget build(BuildContext context) {
return Column(
children: [
Image.asset("assets/$title.jpeg"),
Text("$title"),
Text("Have you ever made your own $title? Once you've tried a homemade $title, you'll never go back."),
],
);
}
}
class MenuItem extends StatelessWidget {
IconData mIcon;
var mText;
MenuItem(this.mIcon, this.mText);
@override
Widget build(BuildContext context) {
return Column(
children: [Icon(mIcon), Text(mText)],
);
}
}
import 'package:flutter/cupertino.dart';
class ListItem extends StatelessWidget {
String title;
ListItem(this.title);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: 2 / 1, // 가로 / 세로
child: ClipRRect(
// 사진 모따기
borderRadius: BorderRadius.circular(20),
child: Image.asset("assets/$title.jpeg", fit: BoxFit.cover),
),
),
Text("$title"),
Text("Have you ever made your own $title? Once you've tried a homemade $title, you'll never go back."),
SizedBox(height: 20),
],
);
}
}
import 'package:flutter/cupertino.dart';
import 'package:google_fonts/google_fonts.dart';
class MTitle extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text(
"Recipes",
style: GoogleFonts.patuaOne(
textStyle: TextStyle(fontSize: 30),
),
);
}
}
import 'package:flutter/material.dart';
class MenuItem extends StatelessWidget {
IconData mIcon;
var mText;
MenuItem(this.mIcon, this.mText);
@override
Widget build(BuildContext context) {
return Container(
width: 60,
height: 80,
decoration: BoxDecoration(
border: Border.all(color: Colors.black12),
borderRadius: BorderRadius.circular(30),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(mIcon, color: Colors.redAccent, size: 30),
SizedBox(height: 5),
Text(mText),
],
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter_cook/component/menu_item.dart';
class Menus extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Row(
children: [
MenuItem(Icons.food_bank, "ALL"),
SizedBox(width: 25),
MenuItem(Icons.emoji_food_beverage, "Coffee"),
SizedBox(width: 25),
MenuItem(Icons.fastfood, "Burger"),
SizedBox(width: 25),
MenuItem(Icons.local_pizza, "Pizza"),
],
);
}
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_cook/component/list_item.dart';
import 'package:flutter_cook/component/m_title.dart';
import 'package:flutter_cook/component/menus.dart';
class MainPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _appbar(),
body: Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: ListView(
children: [
MTitle(),
SizedBox(height: 20),
Menus(),
SizedBox(height: 20),
ListItem("coffee"),
ListItem("burger"),
ListItem("pizza"),
],
),
),
);
}
}
AppBar _appbar() {
return AppBar(
actions: [
Icon(Icons.search),
SizedBox(width: 16),
Icon(CupertinoIcons.heart, color: Colors.redAccent),
SizedBox(width: 16),
],
);
}
An's Blog