Flutter 입문 - 안드로이드, iOS 개발을 한 번에

Flutter 입문 - 안드로이드, iOS 개발을 한 번에

(14개의 수강평)

212명의 수강생
33% 할인 1일 남음

22,000원33,000원

오준석
평생
초급
수료증
37개 수업, 총 21분
Wishlist
연양 프로필

18분 38초에서 login_page에서 연양 1일 전

print 부분에서  Navogator로 코드가 바뀌는데 영상에서는 생략된듯 합니다.
아래와 같이 수정하시면 될 것 같습니다.

SignInButton
(
Buttons.Google,
onPressed: () {
_handleSignIn().then((user) {
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context)=> TabPage(user)));
});

0
궁극의기술 프로필

bottom navigation 을 프로그램을 통해 이동하고자 합니다. 궁극의기술 1일 전

임의의 탭바 위치로 이동하려면 소스 코드에서 어떻게 코딩을 해야할까요? 

GestureDector 등으로 클릭 시 임의의 탭메뉴로 이동하고 해당 탭메뉴가 활성화되게 하고 싶은데요

초보라 구글링을 해도 자료가 별로 없네요.

1
Yong Kim 프로필

정말 도움되는 강의입니다.. 그런데 firebase iOS  설정 중 Yong Kim 2일 전

Android Manifest 에서 가져온 패키지명으로는 iOS 번들아이디 입력이 안되는데 어떤 오류가 있는건가요?

 

1
Andrew Lee 프로필

xcode를 실행한 후에 어떤 메뉴를 클릭해야 하나요? Andrew Lee 10일 전

영상에서 xcode 실행 후 스텝이 안 나와 있네요..

plist 를 다운받고 아무 것도 못하고 있는데 간단히 설명해 주실 수 있을까요?

 

감사합니다.

2
디네쉬 프로필

예제 코드 제공 디네쉬 14일 전

좋은 강의 잘 보고 있습니다.

혹시 예제 코드를 공개하실 계획은 없으신가요?

IDE의 자동완성이 좋긴하지만 dart라는 언어의 장벽도 있고, flutter도 새로운 프레임워크라서 다른 분들도 코드작성에 불편함이 있으실텐데요. 인스타그램 앱이라도 코드가 공개되었으면 합니다. 

 

1
evergreen_sound 프로필

오류 evergreen_sound 20일 전

카메라 버튼을 누르면 아무것도 안뜨네요ㅠㅠ

Unhandled Exception: MissingPluginException(No implementation found for method pickImage on channel plugins.flutter.io/image_picker)

1
이득기 Lee 프로필

구글 서비스 제이슨 파일 문제 이득기 Lee 22일 전

registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)

 

오류가 납니다. 스텍플로우를 찾아보면 4.2.0의 고질적인 문제인것 같은데 어떻게 해결하셨나요?

1
진성주 프로필

구글 로그인 에러가 납니다. 진성주 23일 전

강사님의 타이핑 치시는대로랑 https://pub.dev/packages/firebase_auth#-readme-tab- 공식 라이브러리 대로 둘 다 해봤는데 아래와 같이 오류가 납니다.

E/flutter (20218): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 12500: , null)

E/flutter (20218): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:564:7)

E/flutter (20218): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:302:33)

E/flutter (20218): <asynchronous suspension>

E/flutter (20218): #2      GoogleSignIn._callMethod (package:google_sign_in/google_sign_in.dart:226:58)

E/flutter (20218): <asynchronous suspension>

E/flutter (20218): #3      GoogleSignIn._addMethodCall (package:google_sign_in/google_sign_in.dart:268:20)

E/flutter (20218): #4      GoogleSignIn.signIn (package:google_sign_in/google_sign_in.dart:339:48)

E/flutter (20218): #5      LoginPage._handleSignIn (package:instagram_clone/login_page.dart:43:64)

E/flutter (20218): <asynchronous suspension>

E/flutter (20218): #6      LoginPage.build.<anonymous closure> (package:instagram_clone/login_page.dart:28:19)

E/flutter (20218): #7      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:511:14)

E/flutter (20218): #8      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:566:30)

E/flutter (20218): #9      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:166:24)

E/flutter (20218): #10     TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:240:9)

E/flutter (20218): #11     TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:177:9)

E/flutter (20218): #12     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:436:9)

E/flutter (20218): #13     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)

E/flutter (20218): #14     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)

E/flutter (20218): #15     _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:221:19)

E/flutter (20218): #16     _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:199:22)

E/flutter (20218): #17     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)

E/flutter (20218): #18     _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)

E/flutter (20218): #19     _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)

E/flutter (20218): #20     _rootRunUnary (dart:async/zone.dart:1136:13)

E/flutter (20218): #21     _CustomZone.runUnary (dart:async/zone.dart:1029:19)

E/flutter (20218): #22     _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)

E/flutter (20218): #23     _invoke1 (dart:ui/hooks.dart:233:10)

E/flutter (20218): #24     _dispatchPointerDataPacket (dart:ui/hooks.dart:154:5)

E/flutter (20218): 

구글링 해봐도 뾰족한 수가 없어서 질문으로 남깁니다.

2
Charlie T 프로필

버튼 클릭시 무응답일 경우 Charlie T 1달 전

onPressed: () => _changeMessage() ), 반드시 함수표시 해줄것..

 

2
맑은요정님 프로필

SignOut을 누르면 다시 로그인 페이지로 진행이 되지 ㅇ낳습니다. 맑은요정님 3달 전

SignOut을 누르면 로그인 페이지로 포워딩 되지 않습니다.

될때가 있고 안될때가 있어요.

강의에 보여주신 것처럼 될 때가 있고 되지 않을 때가 있습니다.

3
황원규 프로필

Google 계정 SignOut이제대로 안되는 것 같습니다. 황원규 3달 전

account_page.dart에서 onPressed안에 강좌대로 FirebaseAuth.instance.signOut();과 _googleSignIn.signOut();를 추가하였는데 강좌처럼 root_page.dart로 돌아가서 StreamBuilder를 거치지 않습니다. Route route = MaterialPageRoute(builder: (context) => RootPage());

Navigator.pushReplacement(context, route); 이 두줄을 추가해서 강제로 root_page.dart로 가게 해놨는데 찜찜하네요.. 뭐가 문제인 걸까요

root_page.dart

class RootPage extends StatelessWidget {

@override

Widget build(BuildContext context) {

return StreamBuilder(

stream: FirebaseAuth.instance.onAuthStateChanged,

builder: (BuildContext context, AsyncSnapshot snapshot) {

if (snapshot.hasData) {

return TabPage(snapshot.data);

} else {

return LoginPage();

}

},

);

}

}

account_page.dart

Widget _buildAppBar() {

return AppBar(

actions: [

IconButton(

icon: Icon(Icons.exit_to_app),

onPressed: () {

FirebaseAuth.instance.signOut();

_googleSignIn.signOut();

},

)

]

);

}

4
Blome 프로필

에러가 나서 진행이 안됩니다 ㅠㅠ Blome 3달 전

안녕하세요? Flutter 강의 잘 듣고 있습니다.

프로그래밍을 접한지 얼마 안된 사람인데요...

보고 따라하는 중에 한 곳에서 정체되어 더 이상 진행이 안 됩니다.

고민하다가 쪽지를 드립니다.

firebase google 로그인 연동하는 단계에서 오류가 났습니다.

일단 실행하면 LoginPage가 에뮬레이터에 뜨고 logcat에는

2019-03-02 22:04:54.161 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.164 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.199 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.200 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.209 5054-5082/com.blome.binstagramflutter E/FA: App is missing ACCESS_NETWORK_STATE permission

2019-03-02 22:04:54.210 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.214 5054-5082/com.blome.binstagramflutter E/FA: AppMeasurementReceiver not registered/enabled

2019-03-02 22:04:54.220 5054-5082/com.blome.binstagramflutter E/FA: AppMeasurementService not registered/enabled

2019-03-02 22:04:54.220 5054-5082/com.blome.binstagramflutter E/FA: Uploading is not possible. App measurement disabled

2019-03-02 22:04:54.226 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.230 5054-5082/com.blome.binstagramflutter E/FA: Failed to load metadata: Metadata bundle is null

2019-03-02 22:04:54.250 5054-5082/com.blome.binstagramflutter E/FA: Task exception on worker thread: java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />: com.google.android.gms.measurement.internal.zzfx.zzs(Unknown Source:593)

이런 에러 메시지가 뜨네요.

구글로그인 버튼을 누르면 앱이 종료되고

2019-03-02 22:09:24.125 5054-5054/com.blome.binstagramflutter E/MethodChannel#plugins.flutter.io/google_sign_in: Failed to handle method call

java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

at com.google.android.gms.common.GooglePlayServicesUtilLight.isGooglePlayServicesAvailable(Unknown Source:17)

at com.google.android.gms.common.GoogleApiAvailabilityLight.isGooglePlayServicesAvailable(Unknown Source:5)

at com.google.android.gms.common.GoogleApiAvailability.isGooglePlayServicesAvailable(Unknown Source:94)

at com.google.android.gms.auth.api.signin.GoogleSignInClient.zze(Unknown Source:9)

at com.google.android.gms.auth.api.signin.GoogleSignInClient.getSignInIntent(Unknown Source:18)

at io.flutter.plugins.googlesignin.GoogleSignInPlugin$Delegate.signIn(GoogleSignInPlugin.java:291)

at io.flutter.plugins.googlesignin.GoogleSignInPlugin.onMethodCall(GoogleSignInPlugin.java:77)

at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:200)

at io.flutter.view.FlutterNativeView.handlePlatformMessage(FlutterNativeView.java:163)

at android.os.MessageQueue.nativePollOnce(Native Method)

at android.os.MessageQueue.next(MessageQueue.java:326)

at android.os.Looper.loop(Looper.java:160)

at android.app.ActivityThread.main(ActivityThread.java:6669)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

2019-03-02 22:09:24.149 5054-5240/com.blome.binstagramflutter E/AndroidRuntime: FATAL EXCEPTION: GoogleApiHandler

Process: com.blome.binstagramflutter, PID: 5054

java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

at com.google.android.gms.common.GooglePlayServicesUtilLight.isGooglePlayServicesAvailable(Unknown Source:17)

at com.google.android.gms.common.GoogleApiAvailabilityLight.isGooglePlayServicesAvailable(Unknown Source:5)

at com.google.android.gms.common.GoogleApiAvailability.isGooglePlayServicesAvailable(Unknown Source:94)

at com.google.android.gms.common.internal.GoogleApiAvailabilityCache.getClientAvailability(Unknown Source:23)

at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.connect(Unknown Source:216)

at com.google.android.gms.common.api.internal.GoogleApiManager.zab(Unknown Source:47)

at com.google.android.gms.common.api.internal.GoogleApiManager.handleMessage(Unknown Source:173)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:193)

at android.os.HandlerThread.run(HandlerThread.java:65)

--------- beginning of system

2019-03-02 22:09:24.160 5054-5072/com.blome.binstagramflutter E/flutter: [ERROR:flutter/shell/common/shell.cc(184)] Dart Error: Unhandled exception:

NoSuchMethodError: The getter 'authentication' was called on null.

Receiver: null

Tried calling: authentication

0 Object.noSuchMethod (dart:core/runtime/libobject_patch.dart:50:5)

#1      LoginPage._handleSignIn (package:binstagram_flutter/login_page.dart:52:62)

<asynchronous suspension>

#2 LoginPage.build.<anonymous closure> (package:binstagram_flutter/login_page.dart:26:17)

#3 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)

#4 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)

#5 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)

#6 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)

#7 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7)

#8 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9)

#9 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12)

#10 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11)

#11 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:180:19)

#12 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22)

#13 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7)

#14 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)

#15 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)

#16 _invoke1 (dart:ui/hooks.dart:168:13)

#17 _dispatchPointerDataPacket (dart:ui/hooks.dart:122:5)

이렇게 뜹니다..

--------------------------------------------- -----------------------------------------------------

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

apply plugin: 'com.google.gms.google-services'

android {

compileSdkVersion 28

sourceSets {

main.java.srcDirs += 'src/main/kotlin'

}

lintOptions {

disable 'InvalidPackage'

}

defaultConfig {

// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).

applicationId "com.blome.binstagramflutter"

minSdkVersion 21

targetSdkVersion 28

multiDexEnabled true

versionCode flutterVersionCode.toInteger()

versionName flutterVersionName

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

// TODO: Add your own signing config for the release build.

// Signing with the debug keys for now, so `flutter run --release` works.

signingConfig signingConfigs.debug

}

}

}

flutter {

source '../..'

}

dependencies {

implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

testImplementation 'junit:junit:4.12'

androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'

androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'

implementation 'com.google.firebase:firebase-core:16.0.7'

}

--------------------------------------------- --------------------------------------------------

buildscript {

ext.kotlin_version = '1.3.21'

repositories {

google()

jcenter()

}

dependencies {

classpath 'com.android.tools.build:gradle:3.3.1'

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

classpath 'com.google.gms:google-services:4.2.0'

}

}

allprojects {

repositories {

google()

jcenter()

}

}

rootProject.buildDir = '../build'

subprojects {

project.buildDir = "${rootProject.buildDir}/${project.name}"

}

subprojects {

project.evaluationDependsOn(':app')

}

task clean(type: Delete) {

delete rootProject.buildDir

}

----------------------------------------- ----------------------------------------------

org.gradle.jvmargs=-Xmx1536M

android.useAndroidX=true

android.enableJetifier=true

----------------------------------------------- < 매니페스트 > ---------------------------------------------------

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.blome.binstagramflutter">

<!-- The INTERNET permission is required for development. Specifically,

flutter needs it to communicate with the running application

to allow setting breakpoints, to provide hot reload, etc.

-->

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- io.flutter.app.FlutterApplication is an android.app.Application that

calls FlutterMain.startInitialization(this); in its onCreate method.

In most cases you can leave this as-is, but you if you want to provide

additional functionality it is fine to subclass or reimplement

FlutterApplication and put your custom class here. -->

<application

android:name="io.flutter.app.FlutterApplication"

android:label="binstagram_flutter"

android:icon="@mipmap/ic_launcher">

<activity

android:name=".MainActivity"

android:launchMode="singleTop"

android:theme="@style/LaunchTheme"

android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"

android:hardwareAccelerated="true"

android:windowSoftInputMode="adjustResize">

<!-- This keeps the window background of the activity showing

until Flutter renders its first frame. It can be removed if

there is no splash screen (such as the default splash screen

defined in @style/LaunchTheme). -->

<meta-data

android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"

android:value="true" />

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

뭐가 잘못된걸까요?

2
신형준 프로필

이미지목록 신형준 3달 전

플러터 프로젝트 어느곳에 이미지들을 넣어놔야 에뮬레이터 앨범에서 인식하나요

1
신형준 프로필

안드로이드 호환 신형준 3달 전

웹은 보통 인터넷 익스플로러 10까지는 호환을 맞춰야한다하는 기준이 있는데

안드로이드 sdk 버전도 보통 몇까지는 맞춰야한다하는 기준이 있나요?

1
신형준 프로필

플러터 중급강의 계획 신형준 3달 전

1) 혹시 플러터 중급강의도 오픈할 예정이신가요? 오픈할 예정이시라면 언제쯤 강의를 볼 수 있을가요?

2) 플러터 중급강의를 진행하시면 꼭 다룰거다하는 핵심 내용을 알 수 있을가요

3) 초급강의를 다 듣고 나서는 플러터 공식문서만을 보면서 실무에 사용해야할가요? 아니면 추천해주시는 좋은 참고자료나 강의가 있을가요

3