2주 쯤 된거 같은데 순한 맛 강좌부터 여기까지 왔습니다!!! 항상 좋은 강좌 만들어 주신 것에 대해 감사 드리며 학습하고 있습니다! (_ _ ) 보통 의문점이 생기면 구글링이나 코드를 다르게 작성해보면서 해결해 왔는데 이번 강의에서는 어려운 점이 많아 이렇게 댓글로 질문 남깁니다 ㅠㅜ Q1. WeatherScreen의 method 중에 getSystemTime() method의 return type이 이미 String인데, 어째서 Text에 옮겨줄 때 ${getSystemTime()}와 같은 형태로 넣어주는지 궁금합니다. Unnecessory String interpolation이라는 문구가 표기되기도 하고요. 이 방법이 더 안전하거나 관례같은 건가요? Q2. 전역변수들은 modifier로 final 속성을 default로 가지나요?? 어떻게 setState 없이, 실시간으로 모바일 화면 갱신이 가능한 것인가요? ==>날짜를 표기 하는 방법에 있어서 2가지 방법을 사용 하셨습니다( 전역변수에 DateTime.now()를 담아서 요일 및 날짜 표기 / method 내에서 선언한 변수에 담아서 표기) 그런데 감히 제가 보기에 둘 중 하나로만 작성하는 것이 코드 상으로 깔끔해 보이지 않나? 라는 생각이 들어 두 가지 방법 모두 코딩을 해보았는데, 전역변수로 (이번 강의에서 요일 및 날짜를 표기하는 방법) 코딩한 부분에서는 실행중인 앱 화면 시간이 1분 단위로 갱신이 되질 않았습니다. (앱을 실행한 시간을 기준으로 멈춰있더라구요. hot reload를 해도 마찬가지이며, timebuilder.periodic의 builder 내에 작성 했습니다.) 이는 final속성을 기본적으로 가지고 있기 때문일까요?? 반면에 method 내부에서 작성된 코드는 1분 단위로 화면 상에서 시간이 잘 갱신 되더라구요. 1분 단위로 리턴을 한다는 것은 코드 상으로 이해 하겠는데 어떻게 setState() method 없이 가능한 것일까요?? 그리고 추가적으로 어째서 날짜와 요일은 method 내부가 아닌 따로 빼서 코딩하셨는지 궁금합니다. Q3. 어째서 상위 column에 crossAxisalignment.start속성을 줘야 되는 걸까요? ==>weatherScreen을 구성하는 코드 구조 일부를 기준으로 Column(최상위)[ Column(상위1)[column1(도시명) - row(시간) - column2(온도)] Column(상위2)[divider -Row(정보column3개) ] 같은 형태로 된 부분이 있습니다. 강의를 따라가는 과정에서 column1 에 crossAxisalingment.start로 좌측 정렬을 했기 때문에, 논리적으로 column2에 똑같은 속성을 추가해주면 적용이 되어야하는게 아닌가 라는 생각이 들어 그대로 했습니다만, 적용되지 않고 위 강의처럼 (상위 1) column에 해당 속성을 적용해야 효과가 있었습니다. 이 부분은 왜 그런 걸까요??? 상위 1 column에 속성이 적용 돼서 도시명 column 에 해당 속성은 필요 없어졌겠구나 싶어 지웠더니 도시명 만 좌측정렬이 해제 되더라구요.. 제 질문들은 여기까지 입니다! 메모장에 두서없이 적어논걸 요약해서 적어본다고 써봤는데 정말 가독성이 떨어지네요 ㄷㄷ... 보기 불편하시겠지만 그래도 답변을 주신다면 정말 감사하겠습니다!!! 불편하고 긴 댓글 읽으시느라 고생하셨습니다 (_ _ )
좋은 강의 너무 감사합니다. 따라가던 중 너무 간단한 애러에 당황하고 있습니다. timer_builder: ^2.0.0 을 사용했는데 import 'package:timer_builder/timer_builder.dart'; 적색 밑줄이 생깁니다. dependencies: 아래 칸 고려하여 잘붙였고, weather_screen.dart에 붙였습니다. URI doesn't exist 란 애러 메시지가 뜨고, TimerBuilder 가 생성되지 않습니다. .
강의를 보면 중간에 toDouble()가 갑자기 설명없이 추가 되었는데, 추가해야 하는 이유가 뭔가요? 원래 Double 형으로 받는거라서 형변환이 필요 없어 보이거든요? 변경 전: double temp2 = weatherData['main']['temp']; 변경 후: double temp2 = weatherData['main']['temp'].toDouble(); 강의 잘 듣고 있습니다. 많은 도움이 되네요. 감사합니다.
강의 너무 잘 보고있습니다. 이 강의에서 궁금한것이 있어 댓글을 남깁니다 최초 상위 Column에서 위젯들을 하나씩 나열하다가 가로 정렬이 필요한 부분만 Row로 감싸서 레이아웃 구성을 하면 안되는건가요? 예를들어 순서대로 본다면 Text('서울') -> Row[Text('시간') , Text('날짜') 등등 ] -> Text('온도') 이런식으로 구성해도 문제가 없는것인지 궁금합니다
궁금한 게 한가지 있는데..혹시 permission 관련해서는 어떤 문서를 참고하면 좋을까요? 제가 android / iOS 둘다 debug app을 실행해보고 있는데, 둘다 권한을 묻는 pop up이 뜨지 않고, LocationPermission 클래스 객체를 하나 만들어서 Geolocator.checkPermission() method를 토대로 확인해보면 계속 LocationPermission.denied이라고만 떠서요.. 그러다보니 error가 계속 return 되네요 ㅠ_ㅠ...
@@codingchef 해당 내용 my_location에 있는 getMyCurrentLocation()에 추가해서 진행했었는데요, 잘 안되서... 결국에 찾다찾다 permission handler라는 package 참고해서 나름 해결해보고 있습니다...ㅎㅎ 항상 도움 감사드려요!!
고생하십니다 이런 양질의 수업을 무료로 들을 수 있다니 진짜 감사합니다 선생님!!!!
선생님 앞강의는 막 API 쓰고 이럴 땐 머리가 좀 아팠는데, UI 배치 하는 이번 강의는 뭔가 앱 만드는 느낌도 나고 선생님이 만드신 앱 보면서 생각해보니 많은 도움이 되네요. 감사합니다.
정말 존경합니다. 이런 강좌를 혼자 모두 진행하셨다니 믿기지 않을 정도입니다. 코딩셰프님 덕분에 정말 많이 성장하고 있습니다. 감사합니다!
과분한 말씀입니다. 좋은 강좌를 위해서 항상 노력하겠습니다.
오늘 드디어, 또 하나의 강의가 올라왔네요..운좋게 빨리 볼수 있어서 더 기쁘네요.... 환절기에 건강 조심하시고요..하시는 일도 원하시는 바 대로 잘 진행되길 바랍니다. 감사합니다.
예. 감사합니다.
먼저 좋아요 박고 시청합니다
내일 날씨 앱 다섯 번째 영상도 업로드 될 예정입니다.
프로그래밍 초보자에게 포기 하지 않게끔 쉽고 재미있게 강의 해주신 강사님께 존경과 감사를 표합니다.
과찬의 말씀 감사합니다.
어떤 유료강의 보다 아주 멋진 강의 입니다
너무 잘봤습니다~ 막힘없이 잘 진행되었습니다. 많은 도움되고 있습니다.!
항상 감사하게 보고 있습니다
항상 감사합니다^^
감사합니다~
감사합니다
감사합니다!
😃Good
안녕하세요~ 강의 영상은 항상 잘 보고 있습니다. 행님 강의 영상 내용에 대해 한가지 건의하고 싶은게 있는데요. 다름이 아니라 우리가 흔히 쓰는 앱의 기능 중 게시판? 같은 것도 있는데 데이타베이스(no firebase)와 연동하여 작업하는 영상도 있었으면 좋겠습니다.
강좌 제작에 참고하도록 하겠습니다.
2주 쯤 된거 같은데 순한 맛 강좌부터 여기까지 왔습니다!!! 항상 좋은 강좌 만들어 주신 것에 대해 감사 드리며 학습하고 있습니다! (_ _ )
보통 의문점이 생기면 구글링이나 코드를 다르게 작성해보면서 해결해 왔는데 이번 강의에서는 어려운 점이 많아 이렇게 댓글로 질문 남깁니다 ㅠㅜ
Q1. WeatherScreen의 method 중에 getSystemTime() method의 return type이 이미 String인데, 어째서 Text에 옮겨줄 때 ${getSystemTime()}와 같은 형태로 넣어주는지 궁금합니다. Unnecessory String interpolation이라는 문구가 표기되기도 하고요. 이 방법이 더 안전하거나 관례같은 건가요?
Q2. 전역변수들은 modifier로 final 속성을 default로 가지나요?? 어떻게 setState 없이, 실시간으로 모바일 화면 갱신이 가능한 것인가요?
==>날짜를 표기 하는 방법에 있어서 2가지 방법을 사용 하셨습니다( 전역변수에 DateTime.now()를 담아서 요일 및 날짜 표기 / method 내에서 선언한 변수에 담아서 표기)
그런데 감히 제가 보기에 둘 중 하나로만 작성하는 것이 코드 상으로 깔끔해 보이지 않나? 라는 생각이 들어 두 가지 방법 모두 코딩을 해보았는데,
전역변수로 (이번 강의에서 요일 및 날짜를 표기하는 방법) 코딩한 부분에서는 실행중인 앱 화면 시간이 1분 단위로 갱신이 되질 않았습니다. (앱을 실행한 시간을 기준으로 멈춰있더라구요. hot
reload를 해도 마찬가지이며, timebuilder.periodic의 builder 내에 작성 했습니다.) 이는 final속성을 기본적으로 가지고 있기 때문일까요??
반면에 method 내부에서 작성된 코드는 1분 단위로 화면 상에서 시간이 잘 갱신 되더라구요. 1분 단위로 리턴을 한다는 것은 코드 상으로 이해 하겠는데 어떻게 setState() method 없이 가능한 것일까요??
그리고 추가적으로 어째서 날짜와 요일은 method 내부가 아닌 따로 빼서 코딩하셨는지 궁금합니다.
Q3. 어째서 상위 column에 crossAxisalignment.start속성을 줘야 되는 걸까요?
==>weatherScreen을 구성하는 코드 구조 일부를 기준으로 Column(최상위)[ Column(상위1)[column1(도시명) - row(시간) - column2(온도)] Column(상위2)[divider -Row(정보column3개) ] 같은 형태로 된 부분이 있습니다.
강의를 따라가는 과정에서 column1 에 crossAxisalingment.start로 좌측 정렬을 했기 때문에, 논리적으로 column2에 똑같은 속성을 추가해주면 적용이 되어야하는게 아닌가 라는 생각이 들어 그대로 했습니다만,
적용되지 않고 위 강의처럼 (상위 1) column에 해당 속성을 적용해야 효과가 있었습니다. 이 부분은 왜 그런 걸까요??? 상위 1 column에 속성이 적용 돼서 도시명 column 에 해당 속성은 필요 없어졌겠구나 싶어 지웠더니 도시명 만 좌측정렬이 해제 되더라구요..
제 질문들은 여기까지 입니다! 메모장에 두서없이 적어논걸 요약해서 적어본다고 써봤는데 정말 가독성이 떨어지네요 ㄷㄷ... 보기 불편하시겠지만 그래도 답변을 주신다면 정말 감사하겠습니다!!!
불편하고 긴 댓글 읽으시느라 고생하셨습니다 (_ _ )
좋은 강의 너무 감사합니다. 따라가던 중 너무 간단한 애러에 당황하고 있습니다. timer_builder: ^2.0.0 을 사용했는데 import 'package:timer_builder/timer_builder.dart'; 적색 밑줄이 생깁니다. dependencies: 아래 칸 고려하여 잘붙였고, weather_screen.dart에 붙였습니다. URI doesn't exist 란 애러 메시지가 뜨고, TimerBuilder 가 생성되지 않습니다. .
애고,,,,안드로이드 스튜디오를 종료했다가 다시 시작하니 됩니다.
잘보고 있습니다. 항상 감사합니다
다름이 아니라 svg이미지를 쓸때, The element is not implemented in this library. 이런 오류가 떠서 해결 방법을 찾아보는데 없어서 질문드립니다...
아마 svg파일에 태그가 들어가 있을 겁니다. 이 태그를 제거하거나 가급적 태그가 없는 다른 svg 파일을 사용할 것을 권장드립니다.
강의를 보면 중간에 toDouble()가 갑자기 설명없이 추가 되었는데, 추가해야 하는 이유가 뭔가요?
원래 Double 형으로 받는거라서 형변환이 필요 없어 보이거든요?
변경 전: double temp2 = weatherData['main']['temp'];
변경 후: double temp2 = weatherData['main']['temp'].toDouble();
강의 잘 듣고 있습니다. 많은 도움이 되네요.
감사합니다.
기본적으로 말하신 내용이 맞습니다.
toDouble 메서드를 사용하지 않고 에러가 발생하지 않는다면 그냥 진행하시면 됩니다.
그런데 toDouble 메서드를 붙여주지 않으면 에러가 발생할 때가 있습니다.
이 부분은 일종의 보험이라고 생각하시기 바랍니다.
@@codingchef 친절한 답변 감사합니다
강의 너무 잘 보고있습니다. 이 강의에서 궁금한것이 있어 댓글을 남깁니다 최초 상위 Column에서 위젯들을 하나씩 나열하다가 가로 정렬이 필요한 부분만 Row로 감싸서 레이아웃 구성을 하면 안되는건가요? 예를들어 순서대로 본다면 Text('서울') -> Row[Text('시간') , Text('날짜') 등등 ] -> Text('온도') 이런식으로 구성해도 문제가 없는것인지 궁금합니다
flutter의 장점중에 하나가 다양한 방법으로 레이아웃을 만들 수 있다는 것입니다.
제가 보여드린 방법은 제가 레이아웃을 만드는 방법일 뿐 같은 결과를 만들어내는 조합이 있다면
얼마든지 원하는대로 레이아웃을 구성하셔도 됩니다.
6:37 초 경에 하얀 여백이 안남고 잘 실행이 되는데.. 버젼이 높아져서 그런걸까요?
어차피 여백을 떠나서 infinity 속성을 사용하면 화면을 꽉 채워주니 신경 안써도 될 거 같습니다.
11:00 time builder
혹시 앱바에 버튼들 기능 구현하는 부분이 어디일까요?? 그 부분 찾아서 듣고 싶은데...ㅠㅠ
강의 잘보고있습니다. 그런데 백그라운드를 지금까지는 백그라운드컬러 속성으로 색깔지정을 했다면 이번 강좌에서는 왜 이미지로 대체한건가요? 장점이 있어서 한건지, 큰 의미는 없는건지 궁금합니다.
일반적으로 홈페이지 등도 백그라운드 이미지를 자주 사용합니다. 특별한 장점이라기 보다는 화면을 구성하는 하나의 방식이라고 보면 됩니다.
@@codingchef 그렇군요 감사합니다!
궁금한 게 한가지 있는데..혹시 permission 관련해서는 어떤 문서를 참고하면 좋을까요?
제가 android / iOS 둘다 debug app을 실행해보고 있는데, 둘다 권한을 묻는 pop up이 뜨지 않고, LocationPermission 클래스 객체를 하나 만들어서 Geolocator.checkPermission() method를 토대로 확인해보면 계속 LocationPermission.denied이라고만 떠서요..
그러다보니 error가 계속 return 되네요 ㅠ_ㅠ...
답변이 늦었네요.
getLocation 함수 내에
LocationPermission permission = await Geolocator.requestPermission();
를 추가해 보았는지요?
@@codingchef 해당 내용 my_location에 있는 getMyCurrentLocation()에 추가해서 진행했었는데요, 잘 안되서...
결국에 찾다찾다 permission handler라는 package 참고해서 나름 해결해보고 있습니다...ㅎㅎ
항상 도움 감사드려요!!
새로 받은 패키지 함수들 자동완성이 왜 안되는걸까요?
요일과 날짜를 하나의 text로 합치면 안되나요?
선생님 혹시 앱바를 구현꼭해야하나요 저는 선생님이 보여주신 ui 디자인을 가지고 혼자 먼저해봤는데 앱바를 사용하지안고 SafeArea 를 사용해서 했거든요 혹시 제가 틀린거인가요 ㅠ??
아닙니다. 앱바는 선택사항일 뿐입니다.
@@codingchef 답글 늘 달아주셔서 감사합니다 항상좋은일만 있으세요 ㅎㅎ
24:00
좋아요 한번 밖에 못 눌러서 아쉽습니다.
감사합니다. ^^
제가 구현한 빌드 메서드는 이렇습니다
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.orange,
body: SafeArea(
child:Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
IconButton(
onPressed: (){
}
, icon: Icon(Icons.near_me,
size: 40,
color: Colors.white,
)
),
IconButton(onPressed: (){
}
, icon: Icon(Icons.my_location_outlined,
size:40,
color: Colors.white,
)
),
],
),
SizedBox(
height:150,
),
Padding(
padding: EdgeInsets.only(left: 20),
child: Column(
children: [
Text('${cutyName}',
style: TextStyle(
color: Colors.white,
fontSize: 30,
fontWeight: FontWeight.bold
),
),
Text('${this.now}',
style: TextStyle(
color: Colors.white,
fontSize: 15,
),
),
],
),
),
SizedBox(
height:100,
),
Padding(
padding: EdgeInsets.only(left: 30),
child: Row(
children: [
Text( '${temp} ',
style: TextStyle(
color: Colors.white,
fontSize: 80,
fontWeight: FontWeight.w200
),
),
Text( '℃',
style: TextStyle(
color: Colors.white,
fontSize: 80
),
),
],
),
),
SizedBox(
height: 150,
),
Padding(
padding: EdgeInsets.fromLTRB(30, 0, 30, 0),
child: Container( height:1.0,
width:500.0,
color:Colors.white,),
)
],
),
),
);
}
}
감사합니다
감사합니다~