โ›น๏ธ ๋ผ์ดํ”„/2021 ์—ฌ๋ฆ„๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ)

[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 4์ฃผ์ฐจ - Flutter : Shop App 1

2021. 7. 28. 17:04

Udemy ๊ฐ•์˜๊ฐ€ ์–ด๋А๋ง 50ํผ๋ฅผ ๋„˜๊ฒผ๋‹ค. ์ค‘๊ฐ„์— ์–ด๋ ค์šด ๋ถ€๋ถ„๋„ ๋ช‡ ๊ฐœ ์žˆ์—ˆ์ง€๋งŒ ์ด์ œ ์–ด๋А์ •๋„ ํ˜ผ์ž์„œ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์‚ฌ์‹ค ๊ทธ๋•Œ ๊ทธ๋•Œ ๋ฐ”๋กœ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ ๋ฐ€๋ ค์„œ ์˜ค๋Š˜๋ถ€ํ„ฐ๋ผ๋„ ๋ฐ”๋กœ๋ฐ”๋กœ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ ค๊ณ  ํ•œ๋‹ค.

 

Shop ์–ดํ”Œ์€ ์šฐ์„  GridView ๋กœ ์ƒํ’ˆ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์ƒํ’ˆ๋ณ„๋กœ title ๊ณผ ์ข‹์•„์š” , ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋‹ด๊ธฐ ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

์šฐ์„  ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ–ˆ๋‹ค. models ์—๋Š” ์ƒํ’ˆ ์— ๋Œ€ํ•ด ์ •์˜๋˜์–ด ์žˆ๋‹ค.

 

์•„๋ž˜๊ฐ€ product.dart ์ด๋‹ค. ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ  ์ƒ์„ฑ์ž๊นŒ์ง€ ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ๋‹ค.

class Product {
  final String id;
  final String title;
  final String description;
  final int price;
  final String imageUrl;

  Product({
    required this.id,
    required this.title,
    required this.description,
    required this.price,
    required this.imageUrl,
  });
}

 

๋‹ค์Œ์€ ์ƒํ’ˆ๋“ค์„ UI ์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ screen ์ด๋‹ค.

์ดˆ๊ธฐ์— ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ์‹œ์ผœ์คฌ๋‹ค.

import 'package:flutter/material.dart';
import '../widgets/product_item.dart';
import '../models/product.dart';

class ProductOverViewScreen extends StatelessWidget {
  final List<Product> loadedProducts = [
    Product(
      id: 'p1',
      title: 'Red Shirt',
      description: 'A red shirt - it is pretty red!',
      price: 29,
      imageUrl:
          'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
    ),
    Product(
      id: 'p2',
      title: 'Trousers',
      description: 'A nice pair of trousers.',
      price: 59,
      imageUrl:
          'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Trousers%2C_dress_%28AM_1960.022-8%29.jpg/512px-Trousers%2C_dress_%28AM_1960.022-8%29.jpg',
    ),
    Product(
      id: 'p3',
      title: 'Yellow Scarf',
      description: 'Warm and cozy - exactly what you need for the winter.',
      price: 19,
      imageUrl:
          'https://live.staticflickr.com/4043/4438260868_cc79b3369d_z.jpg',
    ),
    Product(
      id: 'p4',
      title: 'A Pan',
      description: 'Prepare any meal you want.',
      price: 49,
      imageUrl:
          'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Cast-Iron-Pan.jpg/1024px-Cast-Iron-Pan.jpg',
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("My Shop"),
      ),
      body: GridView.builder(
        padding: const EdgeInsets.all(10),
        itemCount: loadedProducts.length,
        itemBuilder: (ctx, index) => ProductItem(
          loadedProducts[index].id,
          loadedProducts[index].title,
          loadedProducts[index].imageUrl,
        ),
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
          childAspectRatio: 1.5,
          crossAxisSpacing: 10,
          mainAxisSpacing: 10,
        ),
      ),
    );
  }
}

์ดํ›„ Widget ๋ถ€๋ถ„์„ ๋ณด๋ฉด body ์— GridView ๋ฅผ builder ๋กœ ์ •์˜ํ•ด์คฌ๋‹ค. ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ builder ๊ฐ€ ๊ฐ€์žฅ ํŽธํ•˜๋‹ค. builder ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  itemCount itemBuilder gridDelegate ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. itemCount ๋Š” GridView ๋กœ ๊ทธ๋ ค๋‚ผ ์ด ๊ฐœ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ , itemBuilder ๋Š” ๊ทธ๋ ค๋‚ผ ์•„์ดํ…œ์„ ์˜๋ฏธํ•œ๋‹ค. gridDelegate ๋Š” GridView ์˜ ์˜ต์…˜ ์ด๋‹ค.

 

builder ์—์„œ ProductItem ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ ํ’ˆ๋ชฉ ์— ํ•ด๋‹นํ•˜๋Š” ์œ„์ ฏ ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ๊ทธ๋Ÿผ product_item ์„ ์‚ดํŽด๋ณด์ž.

import 'package:flutter/material.dart';

class ProductItem extends StatelessWidget {
  final String id;
  final String title;
  final String imageUrl;

  ProductItem(this.id, this.title, this.imageUrl);

  @override
  Widget build(BuildContext context) {
    return GridTile(
      child: Image.network(imageUrl, fit: BoxFit.cover),
      footer: GridTileBar(
        backgroundColor: Colors.black54,
        leading: IconButton(
          icon: Icon(Icons.favorite),
          onPressed: () {},
        ),
        title: Text(
          title,
          textAlign: TextAlign.center,
        ),
        trailing: IconButton(
          icon: Icon(
            Icons.shopping_cart,
          ),
          onPressed: () {},
        ),
      ),
    );
  }
}

๋„ฃ์–ด์ค€ ๋งค๊ฐœ๋ณ€์ˆ˜ id , title , imageUrl ์„ ์ด์šฉํ•˜์—ฌ ํ’ˆ๋ชฉ ์„ ๊ทธ๋ ค๋‚ธ๋‹ค. ์—ฌ๊ธฐ์„œ GridTile ๋กœ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ LIstTile ๊ณผ ๋™์ผํ•˜๋‹ค. footer ์™€ header ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ footer ๋ฅผ ์“ฐ๋ฉด ๋ฐ”๋‹ฅ์— header ๋ฅผ ์“ฐ๋ฉด ์ฒœ์žฅ์— ๊ตฌํ˜„๋œ๋‹ค. ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. ์ฒซ ๋ฒˆ์งธ ์‚ฌ์ง„์ด header , ๋‘ ๋ฒˆ์งธ ์‚ฌ์ง„์ด footer ์ด๋‹ค.

 

 

์ดํ›„ child ์š”์†Œ๋“ค๋กœ leading title trailing ์ด ์กด์žฌํ•˜๊ณ  ์ด๋“ค์„ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์น˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. leading ์€ front , title ์€ ใ…‡ใ…‡... trailing ์€ back ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ์–ดํ”Œ์—์„œ๋Š” 3๊ฐ€์ง€ ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ด ์ค‘์— ํ•˜๋‚˜๋ผ๋„ ์‚ฌ๋ผ์ง„๋‹ค๋ฉด? ์—ญ์‹œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

 

์ฒซ ๋ฒˆ์งธ ์‚ฌ์ง„์€ leading ์„ ์ œ๊ฑฐํ•œ ์‚ฌ์ง„, ๋‘ ๋ฒˆ์งธ ์‚ฌ์ง„์€ title ์„ ์ œ๊ฑฐํ•œ ์‚ฌ์ง„, ์„ธ ๋ฒˆ์งธ ์‚ฌ์ง„์€ trailing ์„ ์ œ๊ฑฐํ•œ ์‚ฌ์ง„์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„์ด ๋œ๋‹ค.

 

GridTileBar ๋ฅผ ๋ณด๋‹ˆ subTitle ์ด๋ผ๋Š” ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค. ์‚ดํŽด๋ณด์ž.

 

์ดํ›„์— GridTile ๋กœ ๊ตฌํ˜„ํ•œ ์ƒํ’ˆ ํ•˜๋‹จ์˜ ์ข‹์•„์š” ์™€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฒ„ํŠผ์„ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด๋ดค๋‹ค. ๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ Provider ๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ๋‹ค. ์‚ฌ์‹ค ์ดํ•ดํ•˜๋Š”๋ฐ ์ข€ ์–ด๋ ค์› ๋‹ค. ์•„์ง๋„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ์ผ๋‹จ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋“ค๊ณ  ์™”๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋ ค์šด๊ฒŒ ํ˜„์‹ค...

 

https://pub.dev/packages/provider

 

provider | Flutter Package

A wrapper around InheritedWidget to make them easier to use and more reusable.

pub.dev

 

์ •๋ฆฌ๋˜์–ด ์žˆ๋Š” ๊ธ€์ด ์žˆ์–ด์„œ ์ฒจ๋ถ€ํ–ˆ๋‹ค.

https://eunjin3786.tistory.com/255

 

[Flutter] Provider๋กœ ์•ฑ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

์•„๋ž˜ ์›€์งค์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•ด์•ผํ• ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ State management ๋ฌธ์„œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 1) ์„ ์–ธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ ์šฐ์„  ์„ ์–ธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. SwiftUI ์ฒ˜๋Ÿผ state๊ฐ€ ๋ฐ”

eunjin3786.tistory.com

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด Flutter ๋Š” Widget ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ ์ด๊ฒŒ ์–ดํ”Œ์„ ์ œ์ž‘ํ•˜๋‹ค๋ณด๋ฉด Widget ๊ฐ„์˜ Depth ๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค. main โ†’ class A, class B, class c... ๋ญ ์ƒ๊ด€ ์—†์„์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋งŒ์•ฝ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ถ€๋ชจ๋ฅผ ๊ฐ–๋Š” (class A-1๊ณผ class C-3 ์ด๋Ÿฐ ๋А๋‚Œ?) ๊ฒฝ์šฐ์— ๋งค๋ฒˆ build ๋ฅผ ๋‹ค์‹œํ•ด์•ผํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์–ด๋ ค์šฐ๋‹ˆ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

 

์ƒํ’ˆ์— ์ข‹์•„์š” ์™€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฒ„ํŠผ์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ข‹์•„์š” ํŽ˜์ด์ง€์™€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋ฒ„ํŠผ์ด ํด๋ฆญ๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์† build ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. Widget ์˜ Depth ๊ฐ€ ๊นŠ์ง€ ์•Š์œผ๋ฉด ์ƒ๊ด€์ด ์—†์ง€๋งŒ ์—ฐ์†์ ์œผ๋กœ inherit ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ provider ์ด๋‹ค. ๋ฐ์ดํ„ฐ ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ

 

products.dart ์™€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” products_grid ๋ฅผ ์‚ดํŽด๋ณด์ž.

import 'package:flutter/material.dart';
import 'product.dart';

class Products with ChangeNotifier {
  List<Product> _items = [
    Product(
      id: 'p1',
      title: 'Red Shirt',
      description: 'A red shirt - it is pretty red!',
      price: 29,
      imageUrl:
          'https://cdn.pixabay.com/photo/2016/10/02/22/17/red-t-shirt-1710578_1280.jpg',
    ),
    Product(
      id: 'p2',
      title: 'Trousers',
      description: 'A nice pair of trousers.',
      price: 59,
      imageUrl:
          'https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/Trousers%2C_dress_%28AM_1960.022-8%29.jpg/512px-Trousers%2C_dress_%28AM_1960.022-8%29.jpg',
    ),
    Product(
      id: 'p3',
      title: 'Yellow Scarf',
      description: 'Warm and cozy - exactly what you need for the winter.',
      price: 19,
      imageUrl:
          'https://live.staticflickr.com/4043/4438260868_cc79b3369d_z.jpg',
    ),
    Product(
      id: 'p4',
      title: 'A Pan',
      description: 'Prepare any meal you want.',
      price: 49,
      imageUrl:
          'https://upload.wikimedia.org/wikipedia/commons/thumb/1/14/Cast-Iron-Pan.jpg/1024px-Cast-Iron-Pan.jpg',
    ),
  ];

  var showFavoritesOnly = false;

  List<Product> get items {
    if (showFavoritesOnly) {
      return _items.where((productItem) => productItem.isFavorite).toList();
    }
    return [..._items];
  }

  Product findById(String id){
    return _items.firstWhere((element) => element.id == id);
  }

  void addProduct() {
    notifyListeners();
  }
}
import 'package:flutter/material.dart';
import '/providers/products.dart';
import '/widgets/product_item.dart';
import 'package:provider/provider.dart';

class ProductsGrid extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final productsData = Provider.of<Products>(context);
    final products = productsData.items;

    return GridView.builder(
      padding: const EdgeInsets.all(10),
      itemCount: products.length,
      itemBuilder: (ctx, index) => ChangeNotifierProvider(
        create: (c) => products[index],
        child: ProductItem(),
      ),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2,
        childAspectRatio: 1.5,
        crossAxisSpacing: 10,
        mainAxisSpacing: 10,
      ),
    );
  }
}

products_grid ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋ฉด Provider.of<์ž๋ฃŒํ˜•>(context) ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ Provider ๋กœ ๊ด€๋ฆฌํ•  ๋ณ€์ˆ˜์ด๋‹ค. ChangeNotifierProvider ๋Š” Provider ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์•„์ดํ…œ์— ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋ฉด setState ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด๋‹ค.

 

import 'package:flutter/material.dart';
import '/providers/product.dart';
import 'package:provider/provider.dart';
import '../screens/product_detail_screen.dart';

class ProductItem extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final product = Provider.of<Product>(context, listen : false);
    return ClipRRect(
      borderRadius: BorderRadius.circular(10),
      child: GridTile(
        child: GestureDetector(
          onTap: () {
            Navigator.of(context).pushNamed(
              ProductDetailScreen.routeName,
              arguments: product.id,
            );
          },
          child: Image.network(product.imageUrl, fit: BoxFit.cover),
        ),
        footer: GridTileBar(
          backgroundColor: Colors.black54,
          leading: Consumer<Product>(
            builder: (ctx, product, child) => IconButton(
              icon: Icon(
                product.isFavorite ? Icons.favorite: Icons.favorite_border,
              ),
              onPressed: () {
                product.toggleFavoriteStatus();
              },
              color: Theme.of(context).accentColor,
            ),
          ),
          title: Text(
            product.title,
            textAlign: TextAlign.center,
          ),
          trailing: IconButton(
            icon: Icon(
              Icons.shopping_cart,
            ),
            onPressed: () {},
            color: Theme.of(context).accentColor,
          ),
        ),
      ),
    );
  }
}

ProductItem ์„ ์‚ดํŽด๋ณด๋ฉด ์—ญ์‹œ Provider.of<Product>(context, listen : false) ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ดํ›„์— Consumer ๋„ ๋“ฑ์žฅํ•˜๋Š”๋ฐ Consumer ๋ถ€๋ถ„๋งŒ ์ƒˆ๋กœ build ํ•˜๊ฒŒ๋œ๋‹ค.

 

์„ค๋ช…์ด ๋งŽ์ด ๋ถ€์กฑํ•˜๊ธด ํ•œ๋ฐ ๋‚˜๋„ ์•„์ง 100% ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์€ ๊ฒƒ ๊ฐ™๋‹ค. ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ๊ฐ์„ ์žก์•„์•ผ๊ฒ ๋‹ค.

 

์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด ์ ‘์†ํ•˜๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

https://github.com/k906506/2021-Summer-Flutter-Study/tree/master/myfourthflutterapp

 

GitHub - k906506/2021-Summer-Flutter-Study: Studying hybrid app development using Dart and Flutter in summer vacation Mogakko

Studying hybrid app development using Dart and Flutter in summer vacation Mogakko ๐Ÿ‘พ - GitHub - k906506/2021-Summer-Flutter-Study: Studying hybrid app development using Dart and Flutter in summer va...

github.com

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'โ›น๏ธ ๋ผ์ดํ”„ > 2021 ์—ฌ๋ฆ„๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 6์ฃผ์ฐจ - Flutter : Shop App 3  (0) 2021.08.10
[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 5์ฃผ์ฐจ - Flutter : Shop App 2  (0) 2021.08.10
[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 3์ฃผ์ฐจ - Flutter : Personal Expense App  (2) 2021.07.22
[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 2์ฃผ์ฐจ - Flutter : Personal Expense App  (0) 2021.07.15
[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 1์ฃผ์ฐจ - Flutter : Quiz App  (0) 2021.07.07
'โ›น๏ธ ๋ผ์ดํ”„/2021 ์—ฌ๋ฆ„๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 6์ฃผ์ฐจ - Flutter : Shop App 3
  • [์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 5์ฃผ์ฐจ - Flutter : Shop App 2
  • [์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 3์ฃผ์ฐจ - Flutter : Personal Expense App
  • [์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 2์ฃผ์ฐจ - Flutter : Personal Expense App
kodo_o
kodo_o
iOS ๊ฟ€์žผ!
kodo_o
๐ŸŽ๐Ÿ
kodo_o
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (149)
    • ๐Ÿ”จ ํ”„๋กœ์ ํŠธ (0)
      • TP 1 (0)
      • WhiteHCCTV (0)
      • FootPrint (0)
    • ๐Ÿ’ป ๊ฐœ๋ฐœ (63)
      • iOS (30)
      • Android (6)
      • Kotlin (4)
      • Flutter (9)
      • Node.js (5)
      • Architecture (1)
      • ์˜ค๋Š˜์˜ ์‚ฝ์งˆ (7)
      • ์—๋Ÿฌ์™€์˜ ๋™์นจ (1)
    • โœ๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (6)
      • Graph (6)
      • String (0)
      • Sort (0)
    • โœ๏ธ ์ฝ”ํ…Œ ์ค€๋น„ (44)
      • Math (1)
      • Implementation (3)
      • String (3)
      • Brute Force (5)
      • Back Tracking (7)
      • Greedy (0)
      • Dynamic Programming (13)
      • Binary Search (1)
      • DFS, BFS (5)
      • Shortest Path (2)
      • Two Pointer (4)
      • MST (0)
    • ๐Ÿ“š CS (6)
      • Operating System (6)
    • โ›น๏ธ ๋ผ์ดํ”„ (30)
      • 2020 ๊ฒจ์šธ๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ) (12)
      • 2021 ์—ฌ๋ฆ„๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ) (6)
      • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ (1)
      • ํšŒ๊ณ  (10)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ๊นƒํ—ˆ๋ธŒ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.
kodo_o
[์ฝ”๋…ํ•˜๊ตฌ๋งŒ 2] 4์ฃผ์ฐจ - Flutter : Shop App 1
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.