<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jiun-dev.log</title>
        <link>https://velog.io/</link>
        <description>즐겁게 개발하고 있습니다. </description>
        <lastBuildDate>Sun, 11 Jul 2021 04:27:57 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jiun-dev.log</title>
            <url>https://images.velog.io/images/jiun-dev/profile/42d7c10f-21f0-46af-bc25-83e10a545638/social.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jiun-dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jiun-dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[swift]'FirebaseCore/FirebaseCore.h' file not found]]></title>
            <link>https://velog.io/@jiun-dev/swiftFirebaseCoreFirebaseCore.h-file-not-found</link>
            <guid>https://velog.io/@jiun-dev/swiftFirebaseCoreFirebaseCore.h-file-not-found</guid>
            <pubDate>Sun, 11 Jul 2021 04:27:57 GMT</pubDate>
            <description><![CDATA[<p>&#39;FirebaseCore/FirebaseCore.h&#39; file not found</p>
<p>파이어베이스로 swift로 앱을 만들어 보던 중에 podfile에 해당 패키지를 분명 다운로드 했지만 파일을 찾을수 없다면서 빌드를 계속 실패했다.</p>
<p>#import &lt;FirebaseCore/FirebaseCore.h&gt;</p>
<p>에러가 난 부분은 이렇게 되어있었다.
unlock 후 과감하게</p>
<p>#import &quot;Firebase.h&quot;</p>
<p>이렇게 바꾸어주니 에러가 사라졌다.</p>
<p>파이어베이스 자체 문제라는데 아무래도 작은 앱을 만들거나 연습을 할 땐 파이어베이스가 간편하고 좋지만</p>
<p>규모가 커질수록 이런저런 자잘한 오류들 때문에 발목을 잡을것 같다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter]ios 실기기 연결 안될 시]]></title>
            <link>https://velog.io/@jiun-dev/Flutterios-%EC%8B%A4%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0-%EC%95%88%EB%90%A0-%EC%8B%9C</link>
            <guid>https://velog.io/@jiun-dev/Flutterios-%EC%8B%A4%EA%B8%B0%EA%B8%B0-%EC%97%B0%EA%B2%B0-%EC%95%88%EB%90%A0-%EC%8B%9C</guid>
            <pubDate>Fri, 09 Jul 2021 00:55:00 GMT</pubDate>
            <description><![CDATA[<p>flutter clean
pod cache clean  --all
rm -rf ios/Flutter/Flutter.framework</p>
<p>flutter pub get
pod install
flutter run</p>
<p>permission handler를 사용하는 경우 pod파일이 초기화 되므로 기존 코드를 따로 백업해둘것!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[heroku 헤로쿠 설치 오류 ]]></title>
            <link>https://velog.io/@jiun-dev/heroku-%ED%97%A4%EB%A1%9C%EC%BF%A0-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98</link>
            <guid>https://velog.io/@jiun-dev/heroku-%ED%97%A4%EB%A1%9C%EC%BF%A0-%EC%84%A4%EC%B9%98-%EC%98%A4%EB%A5%98</guid>
            <pubDate>Sat, 26 Jun 2021 11:12:32 GMT</pubDate>
            <description><![CDATA[<p>fastapi로 만든 서버를 헤로쿠로 배포하는 중에</p>
<p>Cannot install on Intel processor in ARM default prefix (/opt/homebrew)! </p>
<p>난 분명 인텔맥인데 이런 오류를 내면서 설치가 안되었다.</p>
<p>curl <a href="https://cli-assets.heroku.com/install.sh">https://cli-assets.heroku.com/install.sh</a> | sh
위 명령어로 설치하면 잘 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SwiftUI]5분만에 하단 탭바 만들기]]></title>
            <link>https://velog.io/@jiun-dev/SwiftUI5%EB%B6%84%EB%A7%8C%EC%97%90-%ED%95%98%EB%8B%A8-%ED%83%AD%EB%B0%94-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jiun-dev/SwiftUI5%EB%B6%84%EB%A7%8C%EC%97%90-%ED%95%98%EB%8B%A8-%ED%83%AD%EB%B0%94-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Sat, 19 Jun 2021 13:35:34 GMT</pubDate>
            <description><![CDATA[<p>공식문서로 SwiftUI 를 공부하는 중 입니다.</p>
<p>선언형으로 UI를 그릴수 있다는 점에서 매우 쉽고 빠르게 UI를 만들수 있습니다.</p>
<p>평소 플러터로 개발을 해왔던지라 이런 점에서 SwiftUi가 UIKit방식보다 더 익숙하고 </p>
<p>머지않아 대부분 ios앱을 SwiftUI로 개발을 하게 될 거라는 생각에 공부중입니다.</p>
<p>자세히는 모르겠지만 안드로이드 쪽에서도 이러한 방식으로 개발하는 방법이 추가됐다고 들었습니다.</p>
<p>곧 대세가 될것 같다는 주관적인 생각입니다.</p>
<p>SwiftUI로 Swift에 익숙해지면 물론 UIKit 방식도 공부할 생각입니다.</p>
<h1 id="view-만들기">View 만들기</h1>
<p>각 탭별로 어떤 화면을 보여줄지 정해야 합니다.</p>
<pre><code>var body: some View {
        TabView(selection: $selection) {
            Text(&quot;featured&quot;).tabItem { Label(&quot;Featured&quot;, systemImage: &quot;star&quot;)}.tag(Tab.featured)
            Text(&quot;list&quot;).tabItem { Label(&quot;List&quot;, systemImage: &quot;star&quot;) }.tag(Tab.list)
        }
    }</code></pre><p>featured 탭에선 fatured라는 텍스트 list에선 list라는 텍스트를 보여줍니다.</p>
<p>이게 끝입니다.</p>
<h4 id="상당히-간편히-탭뷰를-구현할수-있었습니다-기존의-uikit방식에-비해-코드가-직관적이고-매우-빠르게-ui를-그릴수-있다는-점에서-매우-만족스럽습니다">상당히 간편히 탭뷰를 구현할수 있었습니다. 기존의 UIkit방식에 비해 코드가 직관적이고 매우 빠르게 UI를 그릴수 있다는 점에서 매우 만족스럽습니다.</h4>
<p>출처 : swift공식문서</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SwiftUi] 리스트 좌우 여백]]></title>
            <link>https://velog.io/@jiun-dev/SwiftUi-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A2%8C%EC%9A%B0-%EC%97%AC%EB%B0%B1</link>
            <guid>https://velog.io/@jiun-dev/SwiftUi-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EC%A2%8C%EC%9A%B0-%EC%97%AC%EB%B0%B1</guid>
            <pubDate>Sat, 19 Jun 2021 13:13:24 GMT</pubDate>
            <description><![CDATA[<p>.listRowInsets(EdgeInsets())</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python3 sqlalchemy 버전 변경]]></title>
            <link>https://velog.io/@jiun-dev/python3-sqlalchemy-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@jiun-dev/python3-sqlalchemy-%EB%B2%84%EC%A0%84-%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Sat, 12 Jun 2021 07:10:03 GMT</pubDate>
            <description><![CDATA[<p>python3 -m pip install sqlalchemy==1.3.24</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Flutter url_launcher 플러터에서 url을 연결해주는 라이브러리]]></title>
            <link>https://velog.io/@jiun-dev/Flutter-urllauncher-%ED%94%8C%EB%9F%AC%ED%84%B0%EC%97%90%EC%84%9C-url%EC%9D%84-%EC%97%B0%EA%B2%B0%ED%95%B4%EC%A3%BC%EB%8A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</link>
            <guid>https://velog.io/@jiun-dev/Flutter-urllauncher-%ED%94%8C%EB%9F%AC%ED%84%B0%EC%97%90%EC%84%9C-url%EC%9D%84-%EC%97%B0%EA%B2%B0%ED%95%B4%EC%A3%BC%EB%8A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC</guid>
            <pubDate>Fri, 28 May 2021 01:04:04 GMT</pubDate>
            <description><![CDATA[<p><a href="https://pub.dev/packages/url_launcher">패키지주소</a></p>
<p>해당 패키지를 사용해줍니다.</p>
<p>build.gradle 파일에서 compileSdkVersion이 30으로 되어있는 경우
웹이 안열리는 경우가 있습니다.</p>
<p>구글링 결과 아래 방법을 찾았습니다.
<a href="https://stackoverflow.com/questions/63625023/flutter-url-launcher-unhandled-exception-could-not-launch-youtube-url-caused-b/65082750">해결방법</a></p>
<p>무턱대고 맨 위에있는 방법을 사용하시면 안됩니다.
댓글을 보시면 21년6월을 기준으로 정책이 바뀌어 
모든 권한을 허락하는건 쉽게 하면 안된다고 하네요.</p>
<p>Android/AndroidMainfest.xml파일에</p>
<pre><code>&lt;uses-permission android:name=&quot;android.permission.READ_EXTERNAL_STORAGE&quot; /&gt;  </code></pre><p>밑 부분에 </p>
<pre><code>&lt;queries&gt;
        &lt;intent&gt;
            &lt;action android:name=&quot;android.intent.action.VIEW&quot; /&gt;
            &lt;data android:scheme=&quot;https&quot; /&gt;
        &lt;/intent&gt;
        &lt;intent&gt;
            &lt;action android:name=&quot;android.intent.action.DIAL&quot; /&gt;
            &lt;data android:scheme=&quot;tel&quot; /&gt;
        &lt;/intent&gt;
        &lt;intent&gt;
            &lt;action android:name=&quot;android.intent.action.SEND&quot; /&gt;
            &lt;data android:mimeType=&quot;*/*&quot; /&gt;
        &lt;/intent&gt;
    &lt;/queries&gt;</code></pre><p>이걸 입력해주세요. 그럼 정상작동 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Swift]Command CodeSign failed with a nonzero exit code]]></title>
            <link>https://velog.io/@jiun-dev/SwiftCommand-CodeSign-failed-with-a-nonzero-exit-code</link>
            <guid>https://velog.io/@jiun-dev/SwiftCommand-CodeSign-failed-with-a-nonzero-exit-code</guid>
            <pubDate>Wed, 19 May 2021 11:46:39 GMT</pubDate>
            <description><![CDATA[<p>앱을 하나를 출시해보니</p>
<p>플러터를 공부하다 보니 언젠가는 좋은  앱 개발자가 되려면 플러터로 앱을 만들더라도 네이티브에 대한 이해가 필요하다는걸 느꼈다.</p>
<p>그래서 swift 공식문서 튜토리얼을 따라하던 중 마주친 에러</p>
<p>이유는 공식문서에서 준 파일 권한 문제
image파일들 중에 권한이 읽기전용이거나 비허용으로 된 것들을 풀어준 후 앱을 재 빌드 해주면 해결된다.</p>
<p> 이리저리 키체인 건드렸다가.xattr -lr . xattr -cr . 해봤다가 안됐는데
 이렇게 했더니 바로 됐다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()]]></title>
            <link>https://velog.io/@jiun-dev/Unhandled-Exception-coreno-app-No-Firebase-App-DEFAULT-has-been-created-call-Firebase.initializeApp</link>
            <guid>https://velog.io/@jiun-dev/Unhandled-Exception-coreno-app-No-Firebase-App-DEFAULT-has-been-created-call-Firebase.initializeApp</guid>
            <pubDate>Mon, 10 May 2021 11:22:31 GMT</pubDate>
            <description><![CDATA[<pre><code>void main() async {
  await Firebase.initializeApp();
  runApp(MyApp());
}</code></pre><p>main 부분에 async를 건 후
runApp 전에 await Firebase.initializeApp(); 작성해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Mac]Macintosh HD - Data 디스크를 잠금 해제할 수 없습니다.]]></title>
            <link>https://velog.io/@jiun-dev/MacMacintosh-HD-Data-%EB%94%94%EC%8A%A4%ED%81%AC%EB%A5%BC-%EC%9E%A0%EA%B8%88-%ED%95%B4%EC%A0%9C%ED%95%A0-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
            <guid>https://velog.io/@jiun-dev/MacMacintosh-HD-Data-%EB%94%94%EC%8A%A4%ED%81%AC%EB%A5%BC-%EC%9E%A0%EA%B8%88-%ED%95%B4%EC%A0%9C%ED%95%A0-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4</guid>
            <pubDate>Thu, 06 May 2021 14:07:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://images.velog.io/images/jiun-dev/post/2e613f7b-507a-4db4-8bb4-9cdb3ef73669/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-05-06%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2010.48.09.png" alt=""></p>
<p>빅서를 업데이트 했더니 뜨는 이런 황당한 오류.</p>
<p>애플 공식 홈페이지에도 관련 문의가 여러개 올라갔는데 답변이 하나도 안달렸더라구요.</p>
<p>이유는 불문하고 해결하는 방법만 알려드리겠습니다.</p>
<p><del>사실 다 적기가 귀찮음</del></p>
<h2 id="해당-디스크-포맷">해당 디스크 포맷</h2>
<p>저 디스크 이름을 기억하신 후</p>
<p>재부팅 -&gt; command+R을 꾸욱 눌러줍니다.</p>
<p>후에 해당 디스크를 삭제 하시면 됩니다.</p>
<p>필요한 데이터는 미리 백업해 둡시다. 나중에 제 탓하지 마시구..</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[error: cannot find symbol
    flutterEngine.getPlugins().add();
                                                                       
]]></title>
            <link>https://velog.io/@jiun-dev/error-cannot-find-symbol-flutterEngine.getPlugins.add</link>
            <guid>https://velog.io/@jiun-dev/error-cannot-find-symbol-flutterEngine.getPlugins.add</guid>
            <pubDate>Thu, 29 Apr 2021 05:10:29 GMT</pubDate>
            <description><![CDATA[<p>패키지 경로가 꼬여서 생기는 에러</p>
<p>flutter pub cache repair</p>
<p>설치된 패키지를 재설치해준다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter] error : double-quoted include in framework header, expected..]]></title>
            <link>https://velog.io/@jiun-dev/fatal-error-could-not-build-module-nanopb-include-nanopbpb.h</link>
            <guid>https://velog.io/@jiun-dev/fatal-error-could-not-build-module-nanopb-include-nanopbpb.h</guid>
            <pubDate>Sat, 24 Apr 2021 11:22:18 GMT</pubDate>
            <description><![CDATA[<p>플러터로 개발을 하던 도중 팀원분  코드를 땡겼는데 ios빌드시 발생한 에러.</p>
<p>해석해보자면 프레임워크 헤더에 쌍따옴표가 들어갔다고 한다.</p>
<p>아래 링크를 따라서 xcode 로 들어가 저 부분을 바꾸어 주었다.</p>
<p><a href="https://stackoverflow.com/questions/64310532/could-not-build-module-nanopb-error-in-xcode-12-0-1">링크텍스트</a></p>
<h3 id="그래도-여전이-에러가-해결이-되지-않았다">그래도 여전이 에러가 해결이 되지 않았다..</h3>
<p>나처럼 삽질하는 분들이 없기를 바라면서 </p>
<p>구글링 결과 저 위의 방법도 된다고 하지만 난 적용이 안되었다.</p>
<p>분명 나처럼 해결이 안되는 분들도 있을것이다.</p>
<h3 id="--해결방법">-&gt; 해결방법</h3>
<p>기존에 설치되어 있는 cocoapods를 1.10.1 이상 버전으로 설치해주시면 됩니다.</p>
<p>cocoapod설치로도 한시간은 까먹은거 같은데 </p>
<p>가장편한 방법은 uninstall후 다시 까는것!</p>
<p>문제는 맥 os가 최신버전이어야 해서 결국 미루고 미루었던 Big Sur를 설치해서 해결했습니다..ㅠ</p>
<h2 id="-추가">++ 추가</h2>
<p> error: Build input file cannot be found: &#39;/Users/username/Desktop/GoogleService-Info.plist&#39; (in target &#39;Runner&#39; from project &#39;Runner&#39;)</p>
<p> 다음날 실행해도 다시 에러가 발생</p>
<p> <img src="https://images.velog.io/images/jiun-dev/post/0b48ab75-a5f4-4e3e-81ba-60af5947a7d4/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-04-25%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.52.30.png" alt=""></p>
<p>기존에 있는 GoogleService-info.plist를 지우고</p>
<p>xcode를 연 후에 Runner안에 있는 노란색 Runner폴더 안에 다시 넣어주면 정상적으로 잘 작동한다.</p>
<p>임시방편인거 같은데 후에 정상적인 해결방법을 찾으면 공유해보도록 하겠습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter]Link is not a valid link-local address but contains %. Scope id should be used as part of link-local address.  에러해결]]></title>
            <link>https://velog.io/@jiun-dev/FlutterLink-is-not-a-valid-link-local-address-but-contains-.-Scope-id-should-be-used-as-part-of-link-local-address.-%EC%97%90%EB%9F%AC%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@jiun-dev/FlutterLink-is-not-a-valid-link-local-address-but-contains-.-Scope-id-should-be-used-as-part-of-link-local-address.-%EC%97%90%EB%9F%AC%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Wed, 14 Apr 2021 09:19:14 GMT</pubDate>
            <description><![CDATA[<h3 id="unhandled-exception-formatexception-your_api-is-not-a-valid-link-local-address-but-contains--scope-id-should-be-used-as-part-of-link-local-address-at-character-22">Unhandled Exception: FormatException: YOUR_API is not a valid link-local address but contains %. Scope id should be used as part of link-local address. (at character 22)</h3>
<h4 id="아주-드물게-나오는-플러터-에러다-다른-언어랑-프레임워크들은-써본-경험이-적어서-잘-모르겠는데">아주 드물게 나오는 플러터 에러다. 다른 언어랑 프레임워크들은 써본 경험이 적어서 잘 모르겠는데</h4>
<h4 id="http통신시에-url관련한-에러이다">http통신시에 url관련한 에러이다.</h4>
<h4 id="구글링을-해도-관련-답변이-없어서-한참-애먹었던-에러">구글링을 해도 관련 답변이 없어서 한참 애먹었던 에러!</h4>
<p>알고보면 정말 쉬운 에러..</p>
<h2 id="url을-올바르게-입력해도-종종-char이-맞지-않아서-생기는-에러라고-한다-url을-직접-다시-타이핑-하면-된다">url을 올바르게 입력해도 종종 char이 맞지 않아서 생기는 에러라고 한다. url을 직접 다시 타이핑 하면 된다!</h2>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Flutter]Unhandled Exception: type 'List<String>' is not a subtype of type 'String' in type cast]]></title>
            <link>https://velog.io/@jiun-dev/FlutterUnhandled-Exception-type-ListString-is-not-a-subtype-of-type-String-in-type-cast</link>
            <guid>https://velog.io/@jiun-dev/FlutterUnhandled-Exception-type-ListString-is-not-a-subtype-of-type-String-in-type-cast</guid>
            <pubDate>Mon, 12 Apr 2021 14:02:13 GMT</pubDate>
            <description><![CDATA[<h1 id="error">Error</h1>
<h2 id="unhandled-exception-type-liststring-is-not-a-subtype-of-type-string-in-type-cast">Unhandled Exception: type &#39;List<String>&#39; is not a subtype of type &#39;String&#39; in type cast</h2>
<p>  http로 post를 하다보면 종종 발생하는 에러이다.</p>
<p>  분명 나는 올바르게 http통신을 한 것 같은데 이러한 에러가 발생한다.</p>
<p>  에러를 대략적으로 설명하자면
  List안에 String타입들만 넣어서 보내줘야 하는데 다른 형식이 들어갔다는 것!</p>
<h1 id="solution">Solution</h1>
<h3 id="before-code">Before code</h3>
<pre><code>final url = &#39;api url&#39;;

  List&lt;String&gt; list = [a,b,c,d];

  var body = {
      body = list
  }

  var response = await http.post(url,body: body);
</code></pre><h3 id="after-code">After code</h3>
<pre><code>final url = &#39;api url&#39;;

List&lt;String&gt; list = [a,b,c,d];

  var body = {
      body = list.join(&#39;&#39;),
  }

var response = await http.post(url,body: body);</code></pre><h4 id="list뒤에-join을-붙여서-해결해준다">list뒤에 .join(&#39;&#39;)을 붙여서 해결해준다!</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[flutter] Dio와 FilePicker를 활용하여 api서버에 파일을 전송해보자]]></title>
            <link>https://velog.io/@jiun-dev/flutter-Dio%EC%99%80-FilePicker%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-api%EC%84%9C%EB%B2%84%EC%97%90-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%A0%84%EC%86%A1%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@jiun-dev/flutter-Dio%EC%99%80-FilePicker%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%98%EC%97%AC-api%EC%84%9C%EB%B2%84%EC%97%90-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%A0%84%EC%86%A1%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Thu, 08 Apr 2021 15:01:13 GMT</pubDate>
            <description><![CDATA[<h1 id="플러터로-앱-개발중에-서버에-파일을-전송해야-할-일이-생겼다-일주일을-삽질했지만-다른분이-30분도-안걸려서-해결해주었다">플러터로 앱 개발중에 서버에 파일을 전송해야 할 일이 생겼다. 일주일을 삽질했지만 다른분이 30분도 안걸려서 해결해주었다..</h1>
<h2 id="패키지-설치">패키지 설치</h2>
<p>api서버에서 form-data형태로 파일을 받게 해두었기 때문에 http가 아닌 dio를 활용해 보았다.</p>
<p><a href="https://pub.flutter-io.cn/packages/file_picker">https://pub.flutter-io.cn/packages/file_picker</a></p>
<p><a href="https://pub.flutter-io.cn/packages/dio">https://pub.flutter-io.cn/packages/dio</a></p>
<p>위 두 패키지를 설치해 주시면 됩니다.</p>
<h3 id="코드">코드</h3>
<pre><code>서버에 보내는 메서드

postFile(List&lt;File&gt; files) async {
    final url = &#39;YOUR_API&#39;;

        FormData formData = FormData.fromMap({
          &quot;attachments&quot;: files,
        });

      var dio = new Dio();

        try {
          var response = await dio.post(
            url,
            data: formData,
          );

          print(&quot;응답&quot; + response.data.toString());
        } catch (eee) {
          print(eee.response);
          print(eee.message);
          print(&quot;error occur&quot;);
        }
  }

  버튼을 클릭시 filePicker를 이용해서 파일을 선택할수 있게 해주는 코드

   onPressed: ()  async {
            print(&#39;사진추가&#39;);
            FilePickerResult result = await FilePicker.platform.pickFiles(allowMultiple: true);

            if(result != null) {
              List&lt;File&gt; files = result.paths.map((path) =&gt; File(path)).toList();
              return pickFiles;
            } else {
              // User canceled the picker
            }
          },

아래 코드를 실행시 파일을 서버로 전송하게 됩니다.
onTap:(){
         postNotice(pickFiles);
}

</code></pre><h4 id="코드-설명">코드 설명</h4>
<p>매우 간단합니다. posfFile 이라는 메서드는 Dio를 활용하여 매우 편하게 form-data형태로 서버에 post할수 있게 해줍니다. </p>
<p>onPressed로 클릭시 FilePicker로 사진을 선택할 수 있게 해줍니다.</p>
<p>그리고 postNotice 메서드를 실행하게 되면 선택한 파일을 서버에 보내게 됩니다.</p>
<p>매우 간단하게 서버에 파일을 보낼수 있습니다.</p>
]]></description>
        </item>
    </channel>
</rss>