<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Clone APP Master</title>
        <link>https://velog.io/</link>
        <description>I'm hope to FLUTTER MASTER</description>
        <lastBuildDate>Mon, 19 Jun 2023 03:39:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. Clone APP Master. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/park-jeounghan" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[반이나 왔다
3주차 패키지 사용 및 구현 방법
]]></title>
            <link>https://velog.io/@park-jeounghan/%EB%B0%98%EC%9D%B4%EB%82%98-%EC%99%94%EB%8B%A43%EC%A3%BC%EC%B0%A8-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9-%EB%B0%8F-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@park-jeounghan/%EB%B0%98%EC%9D%B4%EB%82%98-%EC%99%94%EB%8B%A43%EC%A3%BC%EC%B0%A8-%ED%8C%A8%ED%82%A4%EC%A7%80-%EC%82%AC%EC%9A%A9-%EB%B0%8F-%EA%B5%AC%ED%98%84-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 19 Jun 2023 03:39:36 GMT</pubDate>
            <description><![CDATA[<p>provider는 전역적으로 사용되는 데이터를 담당할 서비스로 만들고, 해당 데이터에
CRUD 서비스를 추가함</p>
<ol>
<li>데이터 기본 처리 구현 CRUD</li>
</ol>
<p>Create
Read
Update
Delete</p>
<ol start="2">
<li>이전에 사용했던 StatefulWidget의 setState만을 사용해서는 서로다른 페이지
는 갱신이 어려움
방법이 없지는 않음 &gt; 부모위제세서 자녀위젯으로 계속 넘겨주면 가능한대
앱 사이즈가 커질수록 코드가 너무 많아져 복잡해지는 단점이 있음</li>
</ol>
<p><strong>&gt; 그 이유는 자기 페이지에서만 가능함</strong></p>
<p><strong>&gt; 그래서 사용하는것이 상태관리 패키지를 사용함</strong>
State Management란
즉, 최신상태의 데이터를 보여주도록 페이지 간 데이터를 주고받고 관리하는 행위</p>
<p>데이터를 일괄 관리하는 서비스(클래스)에 지정해서 여러개의 위젯들이 카트에서 
가져다 편하게 사용하는 방법</p>
<p>예)  MyAppBar에서 상태관리 패키지 미 사용 시에는 MyCart -&gt; MyApp -&gt; MyCatalog -&gt;  MyAppbar 이렇게 처리가 됨</p>
<p>MyApp</p>
<p>MyCatalog            MyCart</p>
<p>MyAppBar   MyListitem
**
           MyListitem</p>
<pre><code>       MyListitem</code></pre><ul>
<li>Consume 코드를 감쌓아야함 그래야 별도에 상태관리 서비스가 사용가능함</li>
</ul>
<p>Consumeer : 화면을 새로 그려야할 때 &gt; 계속 새로고침 &gt; 무거움
context.read : 화면을 새로 그리지 않을 떄(1회성으로 변수에 접근할 때) &gt; 가벼움</p>
<p>Extract Method : 함수로 따로 선언해서 코드 리팩토링에 사용</p>
<p>앱을 재시작하면 휘발성 메모리에 저장되어 재시작하면 삭제된다
<strong>&gt; 즉 어플 종료할 때마다 사라짐</strong></p>
<p>방법 </p>
<ol>
<li>기기에 파일로 저장 : shared_preferences</li>
<li>기기 DB 저장 : sqflite 패키지 사용</li>
<li>다른 컴퓨터(서버)에 저장 : 인터넷을 통해 다른 컴퓨터 또는 서버에 전송 저장  방식</li>
</ol>
<ul>
<li>1번에 해당하는 방법으로 진행</li>
</ul>
<p>shared_preferences패키지는
 String, List<String>, int, double, bool 타입만 저장이 가능</p>
<ul>
<li><p>await 함수 사용하기위해선 async()함수를 사용해야함</p>
</li>
<li><p>data를 저장/로드 하는 로직 추가함</p>
<p>saveMemoList() {
 List memoJsonList = memoList.map((memo) =&gt; memo.toJson()).toList();
 // [{&quot;content&quot;: &quot;1&quot;}, {&quot;content&quot;: &quot;2&quot;}]</p>
<p> String jsonString = jsonEncode(memoJsonList);
 // &#39;[{&quot;content&quot;: &quot;1&quot;}, {&quot;content&quot;: &quot;2&quot;}]&#39;</p>
<p> prefs.setString(&#39;memoList&#39;, jsonString);
}</p>
<p>loadMemoList() {
 String? jsonString = prefs.getString(&#39;memoList&#39;);
 // &#39;[{&quot;content&quot;: &quot;1&quot;}, {&quot;content&quot;: &quot;2&quot;}]&#39;</p>
<p> if (jsonString == null) return; // null 이면 로드하지 않음</p>
<p> List memoJsonList = jsonDecode(jsonString);
 // [{&quot;content&quot;: &quot;1&quot;}, {&quot;content&quot;: &quot;2&quot;}]</p>
<p> memoList = memoJsonList.map((json) =&gt; Memo.fromJson(json)).toList();
}</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter TabView란?]]></title>
            <link>https://velog.io/@park-jeounghan/flutter-TabView%EB%9E%80</link>
            <guid>https://velog.io/@park-jeounghan/flutter-TabView%EB%9E%80</guid>
            <pubDate>Mon, 05 Jun 2023 04:17:01 GMT</pubDate>
            <description><![CDATA[<p>위젯은 와 연결된 스와이프할 수 있는 콘텐츠 영역을 만들 수 있는 Flutter 프레임워크의 일부입니다. 선택한 탭에 따라 다른 콘텐츠 보기 간에 전환하는 방법을 제공합니다.TabBarViewTabBar</p>
<p>작동 방식은 다음과 같습니다.TabBarView</p>
<p>위젯은 위젯의 컨텐츠 또는 탭과 컨텐츠 보기를 동기화하기 위해 제공하는 위젯으로 배치되어야 합니다.TabBarViewDefaultTabControllerTabController</p>
<p>는 자식 목록을 가져오며, 여기서 각 자식은 특정 탭의 콘텐츠를 나타냅니다. 자식의 순서는 에 있는 해당 탭의 순서와 일치해야 합니다.TabBarViewWidgetTabBar</p>
<p>사용자가 에서 탭을 선택하면 에서 자동으로 애니메이션을 적용하고 해당 콘텐츠 보기를 표시합니다.TabBarTabBarView</p>
<p>의 콘텐츠 보기는 , , , 또는 사용자 지정 위젯과 같은 모든 종류의 위젯이 될 수 있습니다.TabBarViewContainerListViewGridView</p>
<p>lazily는 자식을 빌드하는데, 이는 현재 표시되는 콘텐츠 보기와 바로 인접한 이웃만 위젯 트리에서 빌드되고 유지 관리됨을 의미합니다. 이렇게 하면 메모리 사용량과 빌드 시간이 줄어들어 성능이 향상됩니다.TabBarView</p>
<p>탭 및 콘텐츠 보기의 수가 많거나 동적인 경우 의 속성을 사용하여 사용자가 탭 사이를 스크롤할 때 요청 시 콘텐츠 보기를 빌드할 수 있습니다.childrenTabBarView.builder()</p>
<p>다음은 사용 예입니다.TabBarView</p>
<p>DefaultTabController(
  length: 3,
  child: Scaffold(
    appBar: AppBar(
      title: Text(&#39;Tabbed App&#39;),
      bottom: TabBar(
        tabs: [
          Tab(text: &#39;Tab 1&#39;),
          Tab(text: &#39;Tab 2&#39;),
          Tab(text: &#39;Tab 3&#39;),
        ],
      ),
    ),
    body: TabBarView(
      children: [
        Container(
          color: Colors.red,
          child: Center(child: Text(&#39;Content for Tab 1&#39;)),
        ),
        Container(
          color: Colors.green,
          child: Center(child: Text(&#39;Content for Tab 2&#39;)),
        ),
        Container(
          color: Colors.blue,
          child: Center(child: Text(&#39;Content for Tab 3&#39;)),
        ),
      ],
    ),
  ),
)
이 예제에는 배경색이 다른 세 개의 위젯이 포함되어 있으며 각 위젯은 특정 탭에 대한 콘텐츠를 표시합니다. 콘텐츠 보기는 사용자가 다른 탭을 선택할 때 느리게 빌드됩니다.TabBarViewContainer</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2주차 스타트!~]]></title>
            <link>https://velog.io/@park-jeounghan/2%EC%A3%BC%EC%B0%A8-%EC%8A%A4%ED%83%80%ED%8A%B8</link>
            <guid>https://velog.io/@park-jeounghan/2%EC%A3%BC%EC%B0%A8-%EC%8A%A4%ED%83%80%ED%8A%B8</guid>
            <pubDate>Mon, 05 Jun 2023 02:02:05 GMT</pubDate>
            <description><![CDATA[<p>2주차에는 큰론코딩을 진행함(당근마켓 메인페이지)</p>
<blockquote>
<p>클론 코딩이란 : 다른 어플리케이션을 복제해서 생성하는걸 의미함</p>
</blockquote>
<p> 모든 함수의 시작은 main()함수이다 인지하자</p>
<p> 위젯은 2가지로 구분된다</p>
<ol>
<li><p>StatelessWidget : 상태가 변하지 않는 위젯(화면내용 X)</p>
</li>
<li><p>StatefulWidget : 상태가 변하는 위젯(화면 내용 O)</p>
<ul>
<li>생성자를 생성 </li>
<li>build 함수는 State 클래스에 있음</li>
</ul>
<ol start="3">
<li>NavigatorWidget : 페이지 이동</li>
</ol>
<p>기본코드 인지</p>
<p> // 페이지 이동</p>
<pre><code>    Navigator.push(
      context,
      MaterialPageRoute(builder: (context) =&gt; SecondPage()), // 다음 페이지
   Navigator.pop(context); // 되돌아가기(앞페이지)

    );</code></pre></li>
</ol>
<ol start="4">
<li><p>home : Homepage() //네임드 파라미터 변수라고함(이름지정 매개변수) &gt; home 변수에 homepage를 넣어라 의미</p>
</li>
<li><p>app을 만들때 기본적으로 레이아웃을 구상 이후에 
코딩 진행</p>
</li>
<li><p>컬럼, 로우, 스택 3가지로만 레이아웃은 다 가능함</p>
<ul>
<li>컬럼 : 말그대로 컬럼</li>
<li>로우 : 말그대로 로우</li>
<li>스택 : 겹치는것.</li>
</ul>
</li>
<li><p>Expanded 위젯 추가 하려면 wrap widh widget 선택
-&gt; widget 이름을 Expanded로 변경</p>
</li>
</ol>
<p>★8. 위젯들을 분리(body 단위) &gt; 기능을 변경하지 않고 코드를 정리(리펙토링)</p>
<ul>
<li>body를 주로 분리</li>
<li>body 내에서 반복되는 코드를 다시  또 위젯으로 분리<blockquote>
<p>extract widget</p>
</blockquote>
</li>
</ul>
<ol start="9">
<li>ListView Builder</li>
</ol>
<p>기본
body: ListView.builder(
          itemCount: 100, // 전체 아이템 개수, 없으면 무한대 표시
          itemBuilder: (context, index) {
            // index는 0 ~ 99까지 증가하며 itemCount만큼 호출됩니다.</p>
<p>사용법 : 반복헤야할 위젯</p>
<p>wrap builder 추가
Listview.builder 입력</p>
<ol start="10">
<li>데이터를 보여주는 껍데기를 View라고 부른다<ul>
<li>View와 데이터를 분리하면 View 재활용이 좋음</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[1주차 스타트~]]></title>
            <link>https://velog.io/@park-jeounghan/1%EC%A3%BC%EC%B0%A8-%EC%8A%A4%ED%83%80%ED%8A%B8</link>
            <guid>https://velog.io/@park-jeounghan/1%EC%A3%BC%EC%B0%A8-%EC%8A%A4%ED%83%80%ED%8A%B8</guid>
            <pubDate>Wed, 31 May 2023 02:22:56 GMT</pubDate>
            <description><![CDATA[<p>0주차 기본 설정 - 개발환경 구성 완료</p>
<ul>
<li><p>개발환경 구성하는대 오류가 겁나 많이 떠서 힘들더라구...</p>
<p>1주차 교육 시작</p>
<p>vscode - 플루터 프로젝트 실행</p>
<p>pubspec.yaml을 주로 수정함</p>
</li>
</ul>
<ol>
<li><p>command palette - flutter new project - app - folder 지정</p>
</li>
<li><p>command palette - Dart:Use Recommanded Settings</p>
<blockquote>
<p>DART 수정사항이 전체 반영</p>
</blockquote>
</li>
<li><p>에뮬레이터 실행
command palette - Flutter launch Emulator - pixel 버전(안드로이드 스튜디오 확인필 실행)</p>
</li>
<li><p>용어 정리
padding : 안쪽여백 
margin : 바깥쪽 여백</p>
</li>
</ol>
<p>  1주체 과제 MovieViews 만들기</p>
<p>  import &#39;package:flutter/material.dart&#39;;</p>
<p>void main() {
  runApp(MyApp());
}</p>
<p>class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);</p>
<p>  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: HomePage(), // 홈페이지 보여주기
    );
  }
}</p>
<p>class HomePage extends StatelessWidget {
  const HomePage({Key? key}) : super(key: key);</p>
<p>  @override
  Widget build(BuildContext context) {
    // 영화 제목, 사진 데이터
    List&lt;Map&lt;String, dynamic&gt;&gt; dataList = [
      {
        &quot;category&quot;: &quot;탑건: 매버릭&quot;,
        &quot;imgUrl&quot;: &quot;<a href="https://i.ibb.co/sR32PN3/topgun.jpg&quot;">https://i.ibb.co/sR32PN3/topgun.jpg&quot;</a>,
      },
      {
        &quot;category&quot;: &quot;마녀2&quot;,
        &quot;imgUrl&quot;: &quot;<a href="https://i.ibb.co/CKMrv91/The-Witch.jpg&quot;">https://i.ibb.co/CKMrv91/The-Witch.jpg&quot;</a>,
      },
      {
        &quot;category&quot;: &quot;범죄도시2&quot;,
        &quot;imgUrl&quot;: &quot;<a href="https://i.ibb.co/2czdVdm/The-Outlaws.jpg&quot;">https://i.ibb.co/2czdVdm/The-Outlaws.jpg&quot;</a>,
      },
      {
        &quot;category&quot;: &quot;헤어질 결심&quot;,
        &quot;imgUrl&quot;: &quot;<a href="https://i.ibb.co/gM394CV/Decision-to-Leave.jpg&quot;">https://i.ibb.co/gM394CV/Decision-to-Leave.jpg&quot;</a>,
      },
      {
        &quot;category&quot;: &quot;브로커&quot;,
        &quot;imgUrl&quot;: &quot;<a href="https://i.ibb.co/MSy1XNB/broker.jpg&quot;">https://i.ibb.co/MSy1XNB/broker.jpg&quot;</a>,
      },
      {
        &quot;category&quot;: &quot;문폴&quot;,
        &quot;imgUrl&quot;: &quot;<a href="https://i.ibb.co/4JYHHtc/Moonfall.jpg&quot;">https://i.ibb.co/4JYHHtc/Moonfall.jpg&quot;</a>,
      },
    ];</p>
<pre><code>// 화면에 보이는 영역
return Scaffold(
  appBar: AppBar(
    elevation: 0,
    backgroundColor: Colors.white,
    centerTitle: false,
    iconTheme: IconThemeData(color: Colors.black),
    title: Text(
      &quot;Movie Reviews&quot;,
      style: TextStyle(
        color: Colors.black,
        fontSize: 28,
        fontWeight: FontWeight.bold,
      ),
    ),
    actions: [
      IconButton(
        onPressed: () {},
        icon: Icon(Icons.person_outline),
      )
    ],
  ),
  body: Column(
    children: [
      Padding(
        padding: const EdgeInsets.all(8.0),
        child: TextField(
          decoration: InputDecoration(
            hintText: &quot;영화 제목을 검색해주세요.&quot;,
            border: OutlineInputBorder(
              borderSide: BorderSide(color: Colors.black),
            ),
            suffixIcon: IconButton(
              icon: Icon(Icons.search),
              onPressed: () {},
            ),
          ),
        ),
      ),
      Divider(height: 1),
      Expanded(
        child: ListView.builder(
          itemCount: dataList.length,
          itemBuilder: (context, index) {
            String category = dataList[index][&#39;category&#39;];
            String imgUrl = dataList[index][&#39;imgUrl&#39;];

            return Card(
              child: Stack(
                alignment: Alignment.center,
                children: [
                  Image.network(
                    imgUrl,
                    width: double.infinity,
                    height: 200,

                    //height: double.maxFinite,
                    fit: BoxFit.cover,
                  ),
                  Container(
                    width: double.infinity,
                    height: 200,
                    color: Colors.black.withOpacity(0.5),
                  ),
                  Text(
                    category,
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 36,
                    ),
                  ),
                ],
              ),
            );
          },
        ),
      ),
    ],
  ),
);</code></pre><p>  }
}</p>
<p>여기서 힘들었던 부분은 처음에 appbar가 아무리 불러도 호출이 안되서 잠깐이나마 해맨거와
두번째로   return Scaffold( 이부분에서어떤식으로 작성하는지 전혀 모른부분..
그리고 나서는 목표물 보면서 하나씩 코딩 모르는건 구글링 참고</p>
<p>그래도 정답은 보지 않았다는거에 1표</p>
<p>비록 내머리에서 다 나와서 코딩한건 아니지만.</p>
<p>1주차는 이렇게 지나가는구나.</p>
<p>여러가지요소들의 대한 사용법도 익히고, 이제 숙달되게 사용해서 숙지하는 방법뿐일거다.</p>
<p>2주차도 기대가 되는구만.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[플루터 앱개발 제작 시작 전 각오]]></title>
            <link>https://velog.io/@park-jeounghan/%ED%94%8C%EB%A3%A8%ED%84%B0-%EC%95%B1%EA%B0%9C%EB%B0%9C-%EC%A0%9C%EC%9E%91-%EC%8B%9C%EC%9E%91-%EC%A0%84-%EA%B0%81%EC%98%A4</link>
            <guid>https://velog.io/@park-jeounghan/%ED%94%8C%EB%A3%A8%ED%84%B0-%EC%95%B1%EA%B0%9C%EB%B0%9C-%EC%A0%9C%EC%9E%91-%EC%8B%9C%EC%9E%91-%EC%A0%84-%EA%B0%81%EC%98%A4</guid>
            <pubDate>Tue, 30 May 2023 00:15:15 GMT</pubDate>
            <description><![CDATA[<p>스파르타코딩클럽 완주 하기위한 각오!!!</p>
<ol>
<li><p>플루터를 열심히 배워서 내가 만들고 싶은 
APP 만들어서구글 Playstore에 Upload가 목적!!!</p>
</li>
<li><p>하나이상의 APP을 개발하는게 목적!!!</p>
</li>
<li><p>내 전부인 현주가 원하는 필요한 앱을 만드는게 목적!★</p>
</li>
</ol>
]]></description>
        </item>
        <item>
            <link>https://velog.io/@park-jeounghan/vmjl2cub</link>
            <guid>https://velog.io/@park-jeounghan/vmjl2cub</guid>
            <pubDate>Tue, 30 May 2023 00:13:46 GMT</pubDate>
            <description><![CDATA[<p>스파르타코딩클럽 완주 하기위한 각오!!!</p>
<p>플루터를 열심히 배워서 내가 만들고 싶은 APP 만들어서</p>
<ul>
<li><p>구글 Playstore에 Upload가 목적!!!</p>
</li>
<li><p>하나이상의 APP을 개발하는게 목적!!!</p>
</li>
<li><p>내 전부인 현주가 원하는 필요한 앱을 만드는게 목적!!!!!!!</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>