<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>oo0o_o0oo.log</title>
        <link>https://velog.io/</link>
        <description>피아노 배우고 싶다</description>
        <lastBuildDate>Thu, 11 Aug 2022 16:21:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>oo0o_o0oo.log</title>
            <url>https://images.velog.io/images/oo0o_o0oo/profile/023949bf-8df2-484b-be84-6cc7ce97a68e/KakaoTalk_20210622_151518410.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. oo0o_o0oo.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/oo0o_o0oo" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[정적 변수 고찰]]></title>
            <link>https://velog.io/@oo0o_o0oo/%EC%A0%95%EC%A0%81-%EB%B3%80%EC%88%98-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@oo0o_o0oo/%EC%A0%95%EC%A0%81-%EB%B3%80%EC%88%98-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Thu, 11 Aug 2022 16:21:46 GMT</pubDate>
            <description><![CDATA[<p>정적 변수(static) 을 사용하다가
당연하게 런타임에 초기화 가능한 값을 넣어주었는데..</p>
<p>대학교 다닐 때 강의에서 들었던 기억으로는, (대부분 c언어)
정적 변수는 컴파일 타임에 초기화 된다는 기억이 갑자기 생각이 났다.</p>
<p>그런데 어떻게 런타임에 초기화가 가능한 값이 대입이 가능한가.. 해서
검색을 해 보았더니, dart공식 문서에는 동적초기화가 된다고 써 있네요.. ?.?
(런타임에, 정적 변수가 사용되는 시점에 초기화)</p>
<p>내 기억이 잘못됬나.. 해서 c언어 기준으로 다시 구글링 시작..</p>
<p>어떠한 블로그에서 c코드를 디스어셈블리 하여 분석한 글을 보았다.
(참조 : - )</p>
<p>해당 글에 따르면,, 컴파일 타임에 초기화 가능한 값들은 컴파일 타임에,
컴파일 타임에 불가능한 값들은 dart와 마찬가지로 동적초기화가 된다고 한다!!
(그 기능/불가능 은 어떻게 판단되는거지..? 기준이 뭔지는 잘 모르겠다)</p>
<p>여튼.. 나도 따라서 해 보며 공부!!</p>
<h3 id="알게-된-것">알게 된 것.</h3>
<ul>
<li>data 영역에 bss라는 영역이 따로 나뉘어진다.</li>
<li>bss영역은 zerofill(값 0으로 초기화되어 변수가 있다는것만 알려주는 적은 메모리를 차지하는 영역)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/oo0o_o0oo/post/d780cc55-3159-4838-be60-0bf31c47375a/image.png" alt=""></p>
<p>그런데.. 디스어셈블리된 코드를 보니
<strong>DATA,</strong>common
<strong>DATA,</strong>bss</p>
<p>이렇게 두 개가 나오는데..
data 영역이 data, bss 로 나뉘는게 아니라</p>
<h3 id="common--bss-로-나뉘는-듯-하다">common , bss 로 나뉘는 듯 하다!</h3>
<p>그래서 val4,5는 bss영역에 잘 들어가는 듯 하고..</p>
<h5 id="q1">Q1</h5>
<p>근데 val6    는 common영역인듯 한데 zerofill ...?</p>
<h1 id="conclusion">Conclusion</h1>
<ul>
<li>언어마다 정적 변수에 값타임이 들어가도 초기화 시점은 컴파일타임이 아닐 수 있는 것 같다. (:=언어마다 다르다)</li>
<li>아직 잘 모르겠다.. 헷</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[플레이 스토어 첫 배포시, 출시 모드로 올리라는 문구 나왔을 경우.]]></title>
            <link>https://velog.io/@oo0o_o0oo/%ED%94%8C%EB%A0%88%EC%9D%B4-%EC%8A%A4%ED%86%A0%EC%96%B4-%EC%B2%AB-%EB%B0%B0%ED%8F%AC%EC%8B%9C-%EC%B6%9C%EC%8B%9C-%EB%AA%A8%EB%93%9C%EB%A1%9C-%EC%98%AC%EB%A6%AC%EB%9D%BC%EB%8A%94-%EB%AC%B8%EA%B5%AC-%EB%82%98%EC%99%94%EC%9D%84-%EA%B2%BD%EC%9A%B0</link>
            <guid>https://velog.io/@oo0o_o0oo/%ED%94%8C%EB%A0%88%EC%9D%B4-%EC%8A%A4%ED%86%A0%EC%96%B4-%EC%B2%AB-%EB%B0%B0%ED%8F%AC%EC%8B%9C-%EC%B6%9C%EC%8B%9C-%EB%AA%A8%EB%93%9C%EB%A1%9C-%EC%98%AC%EB%A6%AC%EB%9D%BC%EB%8A%94-%EB%AC%B8%EA%B5%AC-%EB%82%98%EC%99%94%EC%9D%84-%EA%B2%BD%EC%9A%B0</guid>
            <pubDate>Wed, 20 Apr 2022 02:47:36 GMT</pubDate>
            <description><![CDATA[<p>sign을 해야함!
만약 없을 경우에는 </p>
<pre><code>Androind 프로젝트를 열어서!</code></pre><pre><code>상태표시줄(mac) Build =&gt; Generate Signed Bundle / APK ... </code></pre><p>를 눌러서 키스토어를 만들어야 한다.</p>
<p>이후 진행하면서.. 자동등록?(우측아래) 이 아마 뜨나..?
나는 스킵했는지 모르겠지만, 만약 스킵했을 경우에는</p>
<p><img src="https://velog.velcdn.com/images/oo0o_o0oo/post/568b195f-5ab9-45fe-bb55-7722f716f6d6/image.png" alt="">
app/build.gradle 에서 buildTypes 위에 signingConfigs 를 추가하고,
아까 설정했던 인증 키스토어를 왼쪽 키 [ keyAlias, keyPassword, storeFile, storePassword] 에 맞게 우측에 &quot;<del>~</del>&quot; 문자열로 하드코딩하면 된다.</p>
<p>위 사진처럼 편하게 하려면(보안을 위해, 배포때마다 하드코딩하고 지웠다 깃 푸시하지 말고) app/(요기) 에 키스토어를 복사한 다음,  android root위치에 key.properties 파일을 만들고 다음을 입력.
<img src="https://velog.velcdn.com/images/oo0o_o0oo/post/f9232a73-5936-4cb8-aa1f-ac951c03fb01/image.png" alt="">
key.properties에는 하드코딩 해야함.
대신!!</p>
<pre><code>키스토어 파일, ket.properties 이 두 파일은 반드시 git ignore!!</code></pre><p>이제, bundle 파일로 잘 말아진다 ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[실험] Provider를 GetX 처럼..?]]></title>
            <link>https://velog.io/@oo0o_o0oo/%EC%8B%A4%ED%97%98-Provider%EB%A5%BC-GetX-%EC%B2%98%EB%9F%BC</link>
            <guid>https://velog.io/@oo0o_o0oo/%EC%8B%A4%ED%97%98-Provider%EB%A5%BC-GetX-%EC%B2%98%EB%9F%BC</guid>
            <pubDate>Thu, 17 Feb 2022 01:20:05 GMT</pubDate>
            <description><![CDATA[<p>Provider를 쓰는 도중에 불편한 점(Context!!) 이 있어 글로벌 컨텍스트를 만드는 작업을 하고있었다.</p>
<ul>
<li>개발자 다보님의 Velog 를 따라서.. -
( 출처: <a href="https://velog.io/@adbr/context-%EC%97%86%EB%8A%94-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%99%94%EB%A9%B4-%ED%98%B8%EC%B6%9C">https://velog.io/@adbr/context-%EC%97%86%EB%8A%94-%ED%99%98%EA%B2%BD%EC%97%90%EC%84%9C-%ED%99%94%EB%A9%B4-%ED%98%B8%EC%B6%9C</a> )</li>
</ul>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/b2aaa577-8d9e-477a-bb67-f2cd04f1a27b/image.png" alt="">
글로벌키-네비게이션 스테이트를 만들고, ( 이렇게 클래스로 만들어줘야해!! 이유는 아래 ㅎ )</p>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/71ef86d2-153f-46fb-9711-30bff4a40966/image.png" alt="">
MaterialApp의 navigatorKey에 등록!</p>
<p>그러면 이제,</p>
<pre><code class="language-dart">GlobalState.navigatorState.currentContext</code></pre>
<p>로 컨텍스트를 넘겨받지 않아도 컨텍스트를 쓸 수 있게된다!</p>
<p>그런데 여기서 잠깐..!
프로바이더를 사용하려면 컨텍스트가 필요한데, 요걸 쓰면 GetX처럼 쓸 수 있지 않을까..? 라는 생각에 일단 해 보았다!</p>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/b6f48480-2c5d-48f5-a987-30ee1969bcc4/image.png" alt="">
static getter로 만들어주기!</p>
<h2 id="-주의-">!! 주의 !!</h2>
<ul>
<li>위에 글로벌 키를 class로 만들어야, 위와같이 Provider안에 저렇게 쓸 수 있다(static을 위하여..!) (const로는 안되서..)</li>
</ul>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/078a5665-ae71-4f3c-a1a6-b982f56118a2/image.png" alt="">
그럼 이제, 이렇게 쓸 수 이따!! ㅎㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter google map]]></title>
            <link>https://velog.io/@oo0o_o0oo/Flutter-google-map</link>
            <guid>https://velog.io/@oo0o_o0oo/Flutter-google-map</guid>
            <pubDate>Wed, 21 Jul 2021 11:58:29 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-dart">return GoogleMap(
      gestureRecognizers: &lt;Factory&lt;OneSequenceGestureRecognizer&gt;&gt;[
        new Factory&lt;OneSequenceGestureRecognizer&gt;(
              () =&gt; new EagerGestureRecognizer(),
        ),
      ].toSet(),
      mapType: MapType.normal,
      initialCameraPosition: CameraPosition(target: centerLatLng, zoom: 1.0),   //지도 생성직후의 카메라 위치.
      markers: Set.from(marker),
      //  polylines: _polyLines,
      onMapCreated: (GoogleMapController controller) async {  //initialCameraPosition 이후 보여줄 카메라 위치

        controller.animateCamera(
          CameraUpdate.newLatLngBounds(
            bounds,
            32.0,
          ),
        );

        BitmapDescriptor departureMarker =
        await _bitmapDescriptorFromSvgAsset(context, &#39;images/icons8-point-w-m-fill.svg&#39;);

        BitmapDescriptor stopMarker = await _bitmapDescriptorFromSvgAsset(
            context, &#39;images/icons8-point-stop-m-fill.svg&#39;);

        BitmapDescriptor destinationMarker =
        await _bitmapDescriptorFromSvgAsset(context, &#39;images/icons8-goal-w-m-fill.svg&#39;);

        /*** ㅁㅁㅁ 마커 ***/
        marker.addAll([

              Marker(
              icon: departureMarker,
              markerId: MarkerId(pickUpLatLng.longitude.toString()),
              position: pickUpLatLng,
              infoWindow: pickUpInfoWindow(context)),

          /*** ㅁㅁㅁ 마커 ***/
            Marker(
              //anchor: Offset(5.0, 5.0),  마커가 고정되지 않음
                markerId:
                MarkerId(dropOffLatLng.longitude.toString()),
                position: dropOffLatLng,
                icon: destinationMarker,
                infoWindow: dropOffInfoWindow(context))
        ]);

        if (widget.snapshot.data.stopPlaces != null) {
          /*** ㅁㅁㅁ 마커들 ***/
          marker.addAll([
            for (int index = 0; index &lt; widget.snapshot.data.stopPlaces.length; index++)
              Marker(
                  icon: stopMarker,
                  markerId:
                      MarkerId(&#39;${widget.snapshot.data.stopPlaces[index].stopOriginAddress1}&#39;),
                  position: LatLng(widget.snapshot.data.stopPlaces[index].stopOriginLatitude,
                      widget.snapshot.data.stopPlaces[index].stopOriginLongitude),
                  infoWindow: stopInfoWindow(context))
          ]);
        }

        setState(() {
          marker = marker;
          //  _polyLines.add(polyline);
        });
      },
    );</code></pre>
<h3 id="initialcameraposition">initialCameraPosition</h3>
<pre><code class="language-dart">      initialCameraPosition: CameraPosition(target: centerLatLng, zoom: 1.0) //지도 생성직후의 카메라 위치.</code></pre>
<p>지도 생성 직후에 카메라가 위치하는 곳이다.</p>
<h3 id="latlngbounds">LatLngBounds</h3>
<pre><code class="language-dart">    controller.animateCamera(
      CameraUpdate.newLatLngBounds(
        bounds,
         32.0,
      ),
    );</code></pre>
<p>여기서 bounds 는 LatLngBounds이다.
값으로는 북동좌표와 남서좌표를 가진다.
위 두 좌표를 통하여 사각형을 그리고 googleMap이 사각형에 딱 맞도록 움직인다.</p>
<h3 id="여기서-발견한-추가-팁">여기서 발견한 추가 팁?!</h3>
<pre><code class="language-dart">marker.addAll([
            for (int index = 0; index &lt; widget.snapshot.data.stopPlaces.length; index++)
              Marker(
                  ~~~
                  )
          ]);</code></pre>
<p>addAll 은 인자값으로 주어진 리스트를 전부 추가하는데,
리스트 안에 for문 작성이 가능하다..!</p>
<h2 id="끗">끗</h2>
<p>위 코드로 인한 구글맵은
생성된 후 initailCamera위치에서 시작해서
bounds로 설정된 카메라 크기만큼 확대된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[임시]]></title>
            <link>https://velog.io/@oo0o_o0oo/%EC%9E%84%EC%8B%9C</link>
            <guid>https://velog.io/@oo0o_o0oo/%EC%9E%84%EC%8B%9C</guid>
            <pubDate>Mon, 05 Jul 2021 09:20:50 GMT</pubDate>
            <description><![CDATA[<p>처음에 unable AVD 떠서,
뭘 했고..</p>
<p>그 다음 AVD Manager: The emulator process for AVD was killed. 
떠서, <a href="https://stackoverflow.com/questions/65548240/avd-manager-the-emulator-process-for-avd-was-killed-android-studio-4-1-3-and-m">https://stackoverflow.com/questions/65548240/avd-manager-the-emulator-process-for-avd-was-killed-android-studio-4-1-3-and-m</a>
이거 시도했지만 실패,</p>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/a773091e-86e6-4b29-b7b8-b7d0b9be2482/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/d163aa21-baca-48f4-91e6-5adc279c1655/image.png" alt=""></p>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/661fbb58-a163-45a9-bb38-8d59f918b210/image.png" alt=""></p>
<p>했지만, 감지가 되지 않는다.
<img src="https://images.velog.io/images/oo0o_o0oo/post/6171fa36-0068-4bc0-a4ba-a8b5d2772dac/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter Tips!]]></title>
            <link>https://velog.io/@oo0o_o0oo/Flutter-Tips</link>
            <guid>https://velog.io/@oo0o_o0oo/Flutter-Tips</guid>
            <pubDate>Tue, 29 Jun 2021 05:34:09 GMT</pubDate>
            <description><![CDATA[<h1 id="navigation-tips">Navigation Tips!!</h1>
<h2 id="특정페이지로-돌아가기">특정페이지로 돌아가기</h2>
<pre><code class="language-dart">  Navigator.push&lt;void&gt;(
    context,
    MaterialPageRoute&lt;void&gt;(
      builder: (BuildContext context) =&gt; const MyPage(),
      settings: RouteSettings(name: &#39;my_name&#39;)
    ),
  );
</code></pre>
<p>push할 때 위와 같이 push를 하면,</p>
<pre><code class="language-dart">Navigator.popUntil(context, ModalRoute.withName(&#39;my_name&#39;));</code></pre>
<p>해당 route까지 untilPop을 할 수 있다..!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter animation]]></title>
            <link>https://velog.io/@oo0o_o0oo/Flutter-animation</link>
            <guid>https://velog.io/@oo0o_o0oo/Flutter-animation</guid>
            <pubDate>Tue, 29 Jun 2021 05:16:32 GMT</pubDate>
            <description><![CDATA[<h1 id="listener">Listener</h1>
<blockquote>
<p>리스너는 비동기 기능을 실행할 때 활용하는 기법일 뿐 특별한 객체거나 다른 형식을 갖지 않는다. 플러터 라이브러리에서 리스너, 변경 알림(changeNotifier), 스트림(stream) 등의 용어를 자주 접하게 된다. 이들은 모두 옵저버블(observable)이라는 같은 종류의 프로그래밍 컨셉을 구현한다.</p>
</blockquote>
<p>리스너의 역할을 고려할 때 이는 &#39;옵저버블&#39;생태계에서 적절한 이름이다. 보통 어떤 이벤트가 발생했을 때 실행되는 함수를 리스너라 부른다. 이 함수는 누군가가 &#39;리스너 님이 실행될 차례에요&#39; 라고 말하기를 기다린다.</p>
<blockquote>
</blockquote>
<p>사용자가 탭을 바꾸면 TabController의 addListener함수가 호출된다. 이를 이용해 사용자가 탭을 바꾸면 값이나 상태를 갱신할 수 있다.</p>
<blockquote>
<blockquote>
<blockquote>
<p>FlutterInAction 中</p>
</blockquote>
</blockquote>
</blockquote>
<h2 id="tabcontrollerindexischanging">Tabcontroller.indexIsChanging</h2>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/57f4d3e4-c82c-4541-9750-0b04fdccc2c9/image.png" alt=""></p>
<pre><code class="language-dart">if(Tabcontroller.indexIsChanging) return;</code></pre>
<p>애니메이션(Tab이 변환되는) 중간에 새 이벤트가 발생하는 것을 방지한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter useful plug-in]]></title>
            <link>https://velog.io/@oo0o_o0oo/Creative-Flutter-Plug-in</link>
            <guid>https://velog.io/@oo0o_o0oo/Creative-Flutter-Plug-in</guid>
            <pubDate>Tue, 29 Jun 2021 04:16:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://pub.dev/packages/motion_toast">https://pub.dev/packages/motion_toast</a>
<img  src="https://raw.githubusercontent.com/koukibadr/Motion-Toast/main/info_toast.gif" width="30%" height="30%"></p>
<p>&lt;img src=&quot;<a href="https://images.velog.io/images/post/99bd5126-8640-497c-ad81-0dd2738b50ad/image.png&quot;">https://images.velog.io/images/post/99bd5126-8640-497c-ad81-0dd2738b50ad/image.png&quot;</a> width=&quot;30%&quot; height=&quot;30&gt;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter Key! ( UniqueKey vs ValueKey )]]></title>
            <link>https://velog.io/@oo0o_o0oo/Flutter-Key-UniqueKey-vs-ValueKey</link>
            <guid>https://velog.io/@oo0o_o0oo/Flutter-Key-UniqueKey-vs-ValueKey</guid>
            <pubDate>Mon, 28 Jun 2021 17:57:10 GMT</pubDate>
            <description><![CDATA[<p>UniqueKey vs ValueKey
두 키의 차이점이 뭘까?</p>
<ul>
<li>ValueKey&lt;T&gt;: 상수를 갖는 객체에 키를 추가할 때 사용한다.</li>
<li>UniqueKey: 컬렉션에 자식이 있고 이들이 만들어지기 전 까지 자식의 값을 모르는 상황에서 사용한다.</li>
<li>ObjectKey: 같은 형식의 객체지만 프로퍼티 값이 다른 여러 객체가 있을 때 ObjectKey를 사용한다. product라는 전자상거래 앱이 있다고 가정하자. 두 제품의 이름이 같을 수 있다(두 판매자가 같은 이름의 상품을 파는 상황). 그리고 한 판매자가 여러 제품을 판다면 제품명과 판매자명을 조합해 특정 제품을 식별할 수 있다. 즉 ObjectKey로 전달하는 literal객체가 키다.<pre><code class="language-dart">Key key = ObjectKey({
  &quot;seller&quot;: peoduct.seller,
  &quot;product&quot;: product.title,
})</code></pre>
</li>
<li>PageStrorageKey: 스크롤 위치 등 페이지 정보를 저장하는 특수 키이다.
ㄴ&gt; 책 &#39;flutter in Action&#39; 中</li>
</ul>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/94561bd6-1f2b-4f13-bdf0-1b33199577c8/image.png" alt=""></p>
<p>왼쪽 화살표에 나와 있는 것 처럼 ValueKey를 사용하면 색이 변하지 않지만,
<strong>UniqueKey() 를 위와 같이 사용한다면, ListTile중 하나를 제거하면, 색상이 중구난방으로 바뀐다.</strong></p>
<p>그래도 UniqueKey를 사용하려면 해당 ListView 가 포함된 Build보다 상위트리(또는 그 클래스?) 에서 UniqueKey를 ListView갯수만큼 만들어서 하나씩 할당해주면 됨.</p>
<p>그래서..</p>
<h1 id="결론">결론</h1>
<p>UniqueKey는 Build전에 생성해놓고 사용해줘야 색이 안바뀜.
ValueKey는 그냥 위젯에다 적어놓으면 됨.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[WebView error] Invalid argument (string): Contains invalid characters.]]></title>
            <link>https://velog.io/@oo0o_o0oo/WebView-error-Invalid-argument-string-Contains-invalid-characters</link>
            <guid>https://velog.io/@oo0o_o0oo/WebView-error-Invalid-argument-string-Contains-invalid-characters</guid>
            <pubDate>Mon, 28 Jun 2021 04:02:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/oo0o_o0oo/post/03e3308f-d49a-49c0-aa03-4570ff89a63f/image.png" alt=""></p>
<p>Invalid argument (string): Contains invalid characters. 문구와 함께, 웹뷰에 있는 스크립트 코드 전체가 에러내용으로 포함되어 나왔다.</p>
<p>처음에는, SDK에서 잡아주지 못하는 줄 알고.. 그렇게만 믿고 방황하다가.
string, characters 단어에 갑자기 눈이 가서 위 문장 그대로 구글링하니 원인을 찾게 되었다.. ㅜ</p>
<p>이유는, 스크립트에 한글이 포함되었기 때문.!</p>
<h2 id="해결방법">해결방법</h2>
<pre><code>    Uri.dataFromString( 
    [#스크립트#], 
    mimeType: &#39;text/html&#39;,
    encoding: Encoding.getByName(&#39;utf-8&#39;), &lt;-------------요기 !!!!
    ).toString();</code></pre><p>encoding: Encoding.getByName(&#39;utf-8&#39;) 을 추가해주면 된다.!
Encoding은 dart:convert 를 import해주면 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[질문s]]></title>
            <link>https://velog.io/@oo0o_o0oo/%EC%A7%88%EB%AC%B8s</link>
            <guid>https://velog.io/@oo0o_o0oo/%EC%A7%88%EB%AC%B8s</guid>
            <pubDate>Thu, 24 Jun 2021 08:11:23 GMT</pubDate>
            <description><![CDATA[<h2 id="pakage화-하기"><a href="https://velog.io/@oo0o_o0oo/pakage%ED%99%94-%ED%95%98%EA%B8%B0">pakage화 하기</a></h2>
<p>pubspec.lock 파일은 yaml파일을 pub.get 해야 변경되는데,
위 경로에서 yaml파일 pub.get은 반응이 없다.
그래서, 해당 폴더 루트에 들어가서 커맨드로 실행함.</p>
<p>.lock 과 .pakeges, .flutter_plugins 등의 파일이 생성됨.</p>
<p>해당 폴더나, 그 아래 다른 패키지폴더에서도 pub get을 해주지 않아도 실행은 잘 되었음.. 뭐지?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[pakage화 하기]]></title>
            <link>https://velog.io/@oo0o_o0oo/pakage%ED%99%94-%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@oo0o_o0oo/pakage%ED%99%94-%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 24 Jun 2021 08:11:00 GMT</pubDate>
            <description><![CDATA[<p>만능앱 프로젝트.
모노 레포지터리 형식으로 진행!</p>
<p>여러가지 기능을 추가하려다 보니, yaml파일이 복잡하게 많아 진다.
따라서 각각의 기능들이 <strong>패키지</strong> 로 관리되도록.</p>
<p><img src="https://images.velog.io/images/oo0o_o0oo/post/4ca5ed27-3026-49ea-826c-e24d0f820cf1/image.png" alt=""></p>
<p>명령어로</p>
<pre><code>flutter create —template=package [packageName]</code></pre><p>해도 되지만, 그냥 직접 폴더생성, 파일생성으로 만드는게 더 간단하다고 해서
직접 생성해서 만들었다.</p>
<p>pubspec 파일들은 그냥 일반앱을 복사해서 쓰면 된다고 한다.!</p>
<h2 id="질문">#질문</h2>
<p>pubspec.lock 파일은 yaml파일을 pub.get 해야 변경되는데,
위 경로에서 yaml파일 pub.get은 반응이 없다.
그래서, 해당 폴더 루트에 들어가서 커맨드로 실행함.</p>
<p>.lock 과 .pakeges, .flutter_plugins 등의 파일이 생성됨.</p>
<p>해당 폴더나, 그 아래 다른 패키지폴더에서도 pub get을 해주지 않아도 실행은 잘 되었음.. 뭐지?</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WebView 속성]]></title>
            <link>https://velog.io/@oo0o_o0oo/WebView</link>
            <guid>https://velog.io/@oo0o_o0oo/WebView</guid>
            <pubDate>Wed, 23 Jun 2021 06:38:18 GMT</pubDate>
            <description><![CDATA[<h2 id="javascriptmode">javascriptMode</h2>
<p>자바스크립트를 선택적으로 사용하거나 중지할 수 있음.</p>
<p>JavascriptMode.unrestricted (활성화)
JavascriptMode.disabled (비활성화);기본값</p>
<h2 id="void-functionwebviewcontroller-onwebviewcreated">void Function(WebViewController)? onWebViewCreated</h2>
<p>Flutter에서 WebView를 프로그래밍 방식으로 수정하거나 현재 표시되고 있는 URL과 같은 속성에 액세스 하기 위한 티켓.
나중에 볼 수 있도록 페이지를 즐겨찾기에 저장할 수 있는 기능 등.</p>
<h2 id="gesturerecognizers">gestureRecognizers</h2>
<p>WebView가 동작에 응답하는 다른 위젯 (예: ListView) 내부에 있는 경우 앱이 동작에 응답하는 방식을
지정하려 할 때.</p>
<p>세로 방향의 스크롤 이벤트를 포착하려면 다음과 같이 작성할 수 있습니다.</p>
<pre><code class="language-dart">WebView(
 initialUrl: someUrl,
 gestureRecognizers: Set()
   ..add(Factory&lt;VerticalDragGestureRecognizer&gt;(
     () =&gt; VerticalDragGestureRecognizer())),
)</code></pre>
<p>또는 다음과 같이 다른 방식으로 작성할 수도 있습니다.</p>
<pre><code class="language-dart">var verticalGestures = Factory&lt;VerticalDragGestureRecognizer&gt;(
 () =&gt; VerticalDragGestureRecognizer());
var gestureSet = Set.from([verticalGestures]);
return WebView(
 initialUrl: someUrl,
 gestureRecognizers: gestureSet,
);</code></pre>
<ul>
<li><h4 id="doubletapgesturerecognizer">DoubleTapGestureRecognizer</h4>
<p>사용자가 같은 위치에서 화면을 빠르게 두 번 연속으로 탭한 경우를 인식</p>
</li>
<li><h4 id="multidraggesturerecognizer">MultiDragGestureRecognizer</h4>
<p>ImmediateMultiDragGestureRecognizer , 다중 포인터 드래그 제스쳐 인식.
HorizontalMultiDragGestureRecognizer , 수평으로 시작하는 드래그만 인식.
VerticalMultiDragGestureRecognizer , 수직으로 시작하는 드래그만 인식.
DelayedMultiDragGestureRecognizer , 길게 누르기 제스처 후에 시작되는 드래그만 인식.</p>
</li>
<li><h4 id="multitapgesturerecognizer">MultiTapGestureRecognizer</h4>
<p><a href="https://api.flutter.dev/flutter/gestures/MultiTapGestureRecognizer-class.html">https://api.flutter.dev/flutter/gestures/MultiTapGestureRecognizer-class.html</a></p>
</li>
<li><h4 id="onesequencegesturerecognizer">OneSequenceGestureRecognizer</h4>
<p>한 번에 하나의 제스쳐만 인식 할 수 있는 제스처인식의 기본 클래스.</p>
<p>예를 들어 단일 TapGestureRecognizer는 여러 포인터가 동일한 위젯에 배치되어 있어도
동시에 발생하는 두 탭을 인식할 수 없다.</p>
<p>이는, 예를 들어 각 포인터를 독립적으로 관리하고 별도의 탭에서 각 결과에 대한 여러 동시 터치를 고려할 수 있는
MultiTapGestureRecognizer와 대조된다.</p>
</li>
<li><h4 id="draggesturerecognizer">DragGestureRecognizer</h4>
<p>MultiDragGestureRecognizer 와 달리 DragGestureRecognizer 는 
감시하는 모든 포인터에 대해 단일 제스처 시퀀스를 인식합니다. 
즉, 인식기는 화면과 접촉하는 포인터 수에 관계없이 주어진 시간에 최대 하나의 드래그 시퀀스를 활성화합니다.</p>
<p>DragGestureRecognizer 는 직접 사용할 수 없습니다. 
대신 드래그 제스처에 대한 특정 유형을 인식하기 위해 하위 클래스 중 하나를 사용하는 것이 좋습니다.</p>
<p>DragGestureRecognizer 는 null이 아닌 콜백이 하나 이상있는 경우에만 
kPrimaryButton의 포인터 이벤트에서 경쟁합니다 . 
콜백이없는 경우 작동하지 않습니다.</p>
<p>  HorizontalDragGestureRecognizer , 왼쪽 및 오른쪽 끌기 용.
  VerticalDragGestureRecognizer , 위아래로 끌기.
  PanGestureRecognizer , 단일 축에 고정되지 않은 드래그 용.</p>
</li>
<li><h4 id="eagergesturerecognizer">EagerGestureRecognizer</h4>
<p>일반적으로 뷰 경계 내의 모든 터치 이벤트를 
내장 된 Android 뷰로 즉시 전달하기 위해 AndroidView.gestureRecognizers 에 전달.</p>
<ul>
<li><h4 id="forcepressgesturerecognizer">ForcePressGestureRecognizer</h4>
</li>
</ul>
<p>압력에 의한 터치
<a href="https://api.flutter.dev/flutter/gestures/ForcePressGestureRecognizer-class.html">https://api.flutter.dev/flutter/gestures/ForcePressGestureRecognizer-class.html</a></p>
</li>
<li><h4 id="primarypointergesturerecognizer">PrimaryPointerGestureRecognizer</h4>
<p>제스쳐가 영역 밖으로 나갈 경우 제스쳐 중지.</p>
</li>
<li><h4 id="scalegesturerecognizer">ScaleGestureRecognizer</h4>
<p>화면과 접촉하는 포인터를 추적하고 초점, 표시된 배율 및 회전을 계산</p>
</li>
</ul>
<h3 id="참조">#참조</h3>
<p><a href="https://developers-kr.googleblog.com/2019/05/the-power-of-webviews-in-flutter.html">https://developers-kr.googleblog.com/2019/05/the-power-of-webviews-in-flutter.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹뷰로 카카오맵 보기.]]></title>
            <link>https://velog.io/@oo0o_o0oo/%EC%9B%B9%EB%B7%B0%EB%A1%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A7%B5-%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@oo0o_o0oo/%EC%9B%B9%EB%B7%B0%EB%A1%9C-%EC%B9%B4%EC%B9%B4%EC%98%A4%EB%A7%B5-%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 22 Jun 2021 06:10:24 GMT</pubDate>
            <description><![CDATA[<p><em>*<em>kakaomap_webview 플러그인을 가져옴.
*</em></em></p>
<ul>
<li><a href="https://pub.dev/packages/flutter_kakao_map">https://pub.dev/packages/flutter_kakao_map</a></li>
</ul>
<p>위 플러그인을 만져서, 원하는 형태로 만들어 보려한다.</p>
<ul>
<li><h3 id="error">Error!</h3>
</li>
</ul>
<p>I/chromium( 5467): [INFO:CONSOLE(4)] &quot;A parser-blocking, cross site (i.e. different eTLD+1) script, <a href="http://t1.daumcdn.net/mapjsapi/js/main/4.3.6/kakao.js">http://t1.daumcdn.net/mapjsapi/js/main/4.3.6/kakao.js</a>, is invoked via document.write. The network request for this script MAY be blocked by the browser in this or a future page load due to poor network connectivity. If blocked in this page load, it will be confirmed in a subsequent console message. See <a href="https://www.chromestatus">https://www.chromestatus</a></p>
<p>이러한 경고가 여러개 발생하면서, 아무것도 뜨지 않는다!</p>
<h1 id="해결방법">해결방법</h1>
<h2 id="android">Android</h2>
<ul>
<li>AndroidManifest.xml</li>
</ul>
<p>android:usesCleartextTraffic=&quot;true&quot; 추가.</p>
<pre><code class="language-xml">    &lt;application
        android:name=&quot;io.flutter.app.FlutterApplication&quot;
        android:label=&quot;kakao_map_practice&quot;
        android:icon=&quot;@mipmap/ic_launcher&quot;
        android:usesCleartextTraffic=&quot;true&quot;&gt;</code></pre>
<h2 id="ios">IOS</h2>
<ul>
<li>Info.plist</li>
</ul>
<p>파일 아래부분에 추가.</p>
<pre><code class="language-plist">&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
  &lt;key&gt;NSAllowsArbitraryLoads&lt;/key&gt;
  &lt;true/&gt;
  &lt;key&gt;NSAllowsArbitraryLoadsInWebContent&lt;/key&gt;
  &lt;true/&gt;
&lt;/dict&gt;</code></pre>
<p>.
.
.
.
.</p>
<p>그래도 경고문은 계속 뜨긴 하는데.. 음
<img src="https://images.velog.io/images/oo0o_o0oo/post/758cee32-b66c-4ace-a7ed-aaf0c58c0c18/image.png" alt=""></p>
<p>!!cross site는 신경 안써도 되는 문제.! (카카오dev 답변)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[늦은 개발 블로그 시작.]]></title>
            <link>https://velog.io/@oo0o_o0oo/%EB%8A%A6%EC%9D%80-%EA%B0%9C%EB%B0%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%8B%9C%EC%9E%91</link>
            <guid>https://velog.io/@oo0o_o0oo/%EB%8A%A6%EC%9D%80-%EA%B0%9C%EB%B0%9C-%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%8B%9C%EC%9E%91</guid>
            <pubDate>Tue, 22 Jun 2021 06:02:08 GMT</pubDate>
            <description><![CDATA[<p>2021년 6월 22일.
유튜브에서 <a href="https://www.notion.so/c47951185f404835a982ef97041e59fd">다른 신입개발자의 포트폴리오</a>에 관한 <a href="https://www.youtube.com/watch?v=Yc56NpYW1DM">영상</a>을 봤다.</p>
<p>음.. 자괴감 까지는 아니다.
늦었지만 따라가야겠다는 생각.
<em>(사실 나는 word에 내 공부와 개발과정을 개인적으로 보관하고 있었지만..)</em></p>
<p>늦은 이유가 게을렀기 때문.
블로그를 작성하다 보면 블로그 때문이라도 조금 더 부지런해 질 수 있지 않을까?</p>
<p>열심히 해보자!</p>
]]></description>
        </item>
    </channel>
</rss>