날씨 앱 만들기 | 플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(Weather App) 만들기 1 160 개의 베스트 답변

당신은 주제를 찾고 있습니까 “날씨 앱 만들기 – 플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1“? 다음 카테고리의 웹사이트 you.experience-porthcawl.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.experience-porthcawl.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 코딩셰프 이(가) 작성한 기사에는 조회수 11,995회 및 좋아요 192개 개의 좋아요가 있습니다.

날씨 앱 만들기 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1 – 날씨 앱 만들기 주제에 대한 세부정보를 참조하세요

::::::::: 강좌내용 수정 공지(2022년 버전):::::::::
이 강좌는 널 세이프티 이전에 제작된 강좌입니다.
이번 강좌를 따라오다 보면 후반부에 사용자 디바이스 위치정보 사용 퍼미션을 묻는 팝업창이 뜨지 않을 겁니다. 이럴 때는 getLocation 메서드 내에,
\”Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);\”
이 코드 위에 아래의 코드를 추가해 주면 됩니다.
\”LocationPermission permission = await Geolocator.requestPermission();\”
___________________________________________________________________________________________
정말 오랜만에 올리는 강좌입니다.^^;
이번 시간부터는 플러터(flutter) 날씨 앱(weather app)을 만들어 보겠습니다. 이번 강좌를 통해서 stateful widget(위젯)의 생명주기(widget life cycle)와 API의 기본개념, 그리고 현재 내 위치를 파악해서 위도와 경도로 표시해 주는 flutter geolocator라는 패키지도 설치해 보겠습니다.
조금 매운 맛 후반부 강좌로 들어가는 만큼 추후 강좌들은 실전앱을 만드는 형식으로 진행될 예정입니다. 또한 현재 플러터(Flutter) 2.0으로 업그레이드 되면서 deprecated된 스낵바와 raisedButton(elevatedButton) 강좌에 대한 업데이트도 조만간 예정되어 있으니 기대해 주시기 바랍니다.
프로젝트: https://github.com/icodingchef/weather_app
Geolocator package: https://pub.dev/packages/geolocator
이미지 출처: https://www.freepik.com/
Music licence:
Song – Alex Nekita – Child’s play
Follow Artist : https://soundcloud.com/alexnekita​
Music promoted by DayDreamSound : https://youtu.be/EeGxkWNLnuI​

날씨 앱 만들기 주제에 대한 자세한 내용은 여기를 참조하세요.

실시간 시간 및 날씨 위젯 앱 만들기

실시간 시간 및 날씨 위젯 앱 만들기. ConstraintLayout. Volley. JSON. Weather Api. 이제는 위의 네 개념을 이용한 웹 …

+ 여기에 표시

Source: wikidocs.net

Date Published: 9/21/2022

View: 210

날씨 앱 만들기 : 안드로이드 GPS 정보 받아오기 – 개척 라이프

날씨 앱 만들기 : 안드로이드 GPS 정보 받아오기 · 1. Manifest파일에 권한 추가하기 · 2. LocationManager 객체 생성하기 · 3. 안드로이드 위치정보 권한 …

+ 자세한 내용은 여기를 클릭하십시오

Source: wpioneer.tistory.com

Date Published: 7/26/2022

View: 8058

[miniProject] 간단한 날씨 어플리케이션 만들기 – 왜이렇게어렵지?

[miniProject] 간단한 날씨 어플리케이션 만들기 … 날씨 API를 이용해서 … 등을 통해서 사용자에게 날씨를 알려주는 간단한 어플을 만들려고 …

+ 여기에 표시

Source: whyhard.tistory.com

Date Published: 11/8/2022

View: 9299

#190820. 날씨 앱 만들기 (1) – API 불러오기

날씨 앱 만들기 (1) – API 불러오기. Aria (Applied) 2019. 8. 20. 19:57. 그러다가 또 다시 새로운 강의를 발견했어요. https://www.youtube.com/watch?v=awYSrhUZQL0 …

+ 여기에 자세히 보기

Source: applied-in-dimigo.tistory.com

Date Published: 3/9/2022

View: 6087

플러터로 기상청 날씨 앱 만들기 일지 1. UI 디자인

코딩셰프 강좌를 통해 만든 날씨앱을 활용하여 앱을 제작하기로 했으므로, 배운 코드를 활용하기 위해 우선 코드분석부터 했다.

+ 여기를 클릭

Source: florescene.tistory.com

Date Published: 3/13/2021

View: 7058

디자이너, 날씨앱 개발하기 – 브런치

저는 만드는 것을 좋아합니다. 나무, 가죽, 종이, 회로기판, 자석, 3D 프린팅, html, js, nodejs.. 어떤 재료나 방식이든 상관없이, 각각의 전문가는 …

+ 더 읽기

Source: brunch.co.kr

Date Published: 8/19/2022

View: 4597

주제와 관련된 이미지 날씨 앱 만들기

주제와 관련된 더 많은 사진을 참조하십시오 플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

플러터(Flutter)  조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1
플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1

주제에 대한 기사 평가 날씨 앱 만들기

  • Author: 코딩셰프
  • Views: 조회수 11,995회
  • Likes: 좋아요 192개
  • Date Published: 2021. 1. 28.
  • Video Url link: https://www.youtube.com/watch?v=YqKMBQYZSmw

날씨 앱 만들기 : 안드로이드 GPS 정보 받아오기

728×90

반응형

날씨 앱을 만들기 위해선 필수적으로 필요한 GPS 정보를 받아와 보기로 했다.

일단 GPS 정보를 받아오기 위해선 아래와 같은 과정을 거친다.

1. Manifest파일에 권한 추가하기

2. LocationManager 객체 생성하기

3. 안드로이드 위치정보 권한 확인후 권한 요청하기

4. 위치정보 권한 요청에 의한 콜백 함수인 onRequestPermissionsResult() 만들기

5. 위치정보 update 되었을때 실행하는 onLocationChanged() 만들기

1번 과정부터 차근차근히 살펴보자.

1. Manifest파일에 권한 추가하기

일단 Manifest 파일에 들어가서 아래처럼 권한을 추가한다.

2. LocationManager 객체 생성하기

권한을 추가해줬다면 LocationManager를 사용할 Activity로 이동해서 해당 Activity에서

LocationManager 객체를 생성해줘야 한다

나는 캡슐화를 통해서 만들것이기 때문에 해당 Class 내에서 먼저 LocationManager 변수를 만들어줬고

private LocationManager lm;

그 다음에 해당 Activity 내의 onCreate() 내에서 객체를 생성해주었다.

//LocationManager 객체 생성 lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

3. 안드로이드 위치정보 권한 확인후 권한 요청하기

그럼 이제 해당 앱에서의 위치정보 권한이 있는지 확인한 다음에 없다면 권한 요청을 해줘야 한다.

해당 부분의 코드는 아래와 같다.

//위치정보 권한 허용되어 있는지 아닌지를 확인하는 부분 if(ActivityCompat.checkSelfPermission(SplashActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ //위치정보 권한 허용되어 있지 않다면 실행하는 코드, 여기서 request에 대한 응답이 나오면 아래에 있는 onRequestPermissionsResult() 함수를 콜백하게 됨 ActivityCompat.requestPermissions(SplashActivity.this,new String[]{ Manifest.permission.ACCESS_FINE_LOCATION},200); //위치정보 권한을 요청한다. }else { //위치정보 권한이 허용되어 있을때 실행하는 코드 }

이렇게 되면 이제 앱을 키게 되면 아래와 같이 위치정보 권한 요청을 하게 된다.

4. 위치정보 권한 요청에 의한 콜백 함수인 onRequestPermissionsResult() 만들기

onRequestPermissionsResult() 은 우리가 3번 과정에서 권한 요청에 대한 결과를 받았을때

호출하게 되는 함수이다.

나는 결과요청을 받았을때 아래와 같은 결과를 내볼 예정이다.

위치정보 권한 허가 요청을 받았을때

– 위치정보 권한 허가 요청을 받았을때는 현재 위치정보를 찍고 날씨정보 API 호출하기

위치정보 권한 허가 요청을 못 받았을때

– 위치정보 허가를 못받았을시에는 현재 위치정보를 토대로 날씨정보를 받아오지 못한다고

ToastMessage 출력후 기본 설정 위치로 날씨정보 API 호출하기

그것에 대한 코드는 아래와 같다.

@Override public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 200){ //permissionCode가 200이고 if(grantResults[0] == 0){ // 그중 가장 첫번째 result가 0 즉 승인된경우 진입 Toast.makeText(getApplicationContext(),”위치정보 승인됨”,Toast.LENGTH_SHORT).show(); //위치정보 승인됐다고 알리고 //위치정보 권한을 받았다면 진입 if(ActivityCompat.checkSelfPermission(SplashActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){ lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,this); //위치정보를 update하는 함수 } getWeather(mavm); }else{ //위치정보를 허가받지 못했을경우 진입 Toast.makeText(getApplicationContext(),”위치정보를 승인하지 않으면 현재위치 기반으로

날씨정보를 알려드릴수 없습니다.”,Toast.LENGTH_LONG).show(); getWeather(mavm); //날씨정보 api 호출 } } }

그럼 이제 우리가 requestLocationUpdates()를 호출했으니 위치정보가 update되었을때 호출하는 콜백함수

onLocationChanged() 만 만들면 완료다.

5. 위치정보 update 되었을때 실행하는 onLocationChanged() 만들기

onLocationChanged() 함수는 위치정보가 update되어졌을때 호출하는 콜백 함수이다.

따라서 우리가 4번 단계에서 위치정보 update를 요청했을때 완료가 되면 해야할 행동은 아래와 같다.

위도와 경도를 입력을 하고 입력한 위도와 경도 출력이다.

(나는 위도와 경도를 입력할수 있도록 Coord 라는 class를 만들고 onCreate()에서 인스턴스(객체)를 생성하였다.)

코드는 아래와 같다.

@Override public void onLocationChanged(Location location) { coord.setLat(location.getLatitude()); //위도를 입력 coord.setLon(location.getLongitude()); //경도를 입력 Log.d(TAG,coord.toString()); //입력한 위도와 경두를 출력 //이건 이제 한번 update하고 나서 위치를 업데이트 다시 안시키기 위해서 하는것임 //이걸 하지 않으면 위치정보를 계속해서 update하기때문에 배터리 소모하게됨 lm.removeUpdates(this); }

이렇게 되면 위치정보를 받을수 있게 된다.

나의 전체적인 코드는 아래와 같다.

package wook.co.weather.view.splash; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import wook.co.weather.R; import wook.co.weather.models.dto.Coord; import wook.co.weather.models.dto.OpenWeather; import wook.co.weather.models.dto.ShortWeather; import wook.co.weather.view.MainActivity; import wook.co.weather.viewmodels.MAgencyViewModel; import wook.co.weather.viewmodels.WeatherViewModel; public class SplashActivity extends AppCompatActivity implements LocationListener { private ShortWeather sw; private MAgencyViewModel mavm; private final String TAG = “SplashActivity”; private LocationManager lm; private Coord coord; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash_screen); //MAgencyViewModel 객체 생성 mavm = new ViewModelProvider(this).get(MAgencyViewModel.class); coord = new Coord(); //LocationManager 객체 생성 lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); //위치정보 권한 허용되어 있는지 아닌지를 확인하는 부분 if(ActivityCompat.checkSelfPermission(SplashActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ //위치정보 권한 허용되어 있지 않다면 실행하는 코드, 여기서 request에 대한 응답이 나오면 아래에 있는 onRequestPermissionsResult() 함수를 콜백하게 됨 ActivityCompat.requestPermissions(SplashActivity.this,new String[]{ Manifest.permission.ACCESS_FINE_LOCATION},200); //위치정보 권한을 요청한다. }else { //위치정보 권한이 허용되어 있을때 실행하는 코드 Log.d(TAG, “위치정보 허용됨”); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,this); getWeather(mavm); } } @Override public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 200){ //permissionCode가 200이고 if(grantResults[0] == 0){ // 그중 가장 첫번째 result가 0 즉 승인된경우 진입 Toast.makeText(getApplicationContext(),”위치정보 승인됨”,Toast.LENGTH_SHORT).show(); //위치정보 승인됐다고 알리고 //위치정보 권한을 받았다면 진입 if(ActivityCompat.checkSelfPermission(SplashActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){ lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,this); //위치정보를 update하는 함수 } getWeather(mavm); }else{ //위치정보를 허가받지 못했을경우 진입 Toast.makeText(getApplicationContext(),”위치정보를 승인하지 않으면 현재위치 기반으로

날씨정보를 알려드릴수 없습니다.”,Toast.LENGTH_LONG).show(); getWeather(mavm); } } } public void getWeather(MAgencyViewModel mavm){ mavm.init(); mavm.getWeather().observe(this, new Observer() { @Override public void onChanged(ShortWeather shortWeather) { sw = mavm.getWeather().getValue(); Log.i(TAG,sw.toString()); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //intent 형성한다. Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);//액티비티 스택제거 //해당 intent에 객체를 실어서 보낸다. intent.putExtra(“shortWeather”,sw); startActivity(intent); } },1000); } }); } @Override public void onLocationChanged(Location location) { coord.setLat(location.getLatitude()); //위도를 입력 coord.setLon(location.getLongitude()); //경도를 입력 Log.d(TAG,coord.toString()); //입력한 위도와 경두를 출력 //이건 이제 한번 update하고 나서 위치를 업데이트 다시 안시키기 위해서 하는것임 //이걸 하지 않으면 위치정보를 계속해서 update하기때문에 배터리 소모하게됨 lm.removeUpdates(this); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }

반응형

[miniProject] 간단한 날씨 어플리케이션 만들기

안녕하세요

오늘은 간단하게 날씨를 알려주는 어플리케이션을 만들어 보았습니다.

날씨 API를 이용해서

현재 온도

현재 위치

날씨정보

날씨 아이콘

등을 통해서 사용자에게 날씨를 알려주는 간단한 어플을 만들려고 했습니다.

다음으로 코드작성을 해보겠습니다.

1. HTML 파일

now weather?

지금 날씨는

2. CSS 파일

* { padding: 0; margin: 0; } body { background: linear-gradient(45deg, #4fc3f7, #0093c4 ); } .container { width: 100%; height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; } .container * { margin: 10px; color: #fce4ec; } .container h1 { font-size: 3em; } .weatherInfo { font-size: 1.5em; }

여기서 포인트는

첫번째로 linear-gradient를 사용해서 그라데이션을 할 수 있다는 것입니다.

두번째로 height: 100vh로 설정하고 flex를 이용해서 container클래스의 div태그를 정중앙으로 옮길 수 있었습니다.

추가적으로 Color Tool 이라는 사이트를 사용하니 정말 간단하게 마음에 드는 색상을 고를 수 있었습니다.

https://material.io/resources/color/#!/?view.left=0&view.right=0

3. Javascript 파일

const API_KEY = “#”; //add your API KEY const COORDS = ‘coords’; //좌표를 받을 변수 //DOM객체들 const weatherInfo = document.querySelector(‘.weatherInfo’); const weatherIconImg = document.querySelector(‘.weatherIcon’); //초기화 function init() { askForCoords(); } //좌표를 물어보는 함수 function askForCoords() { navigator.geolocation.getCurrentPosition(handleSuccess, handleError); } //좌표를 얻는데 성공했을 때 쓰이는 함수 function handleSuccess(position) { const latitude = position.coords.latitude; const longitude = position.coords.longitude; const coordsObj = { latitude, longitude }; getWeather(latitude, longitude); //얻은 좌표값을 바탕으로 날씨정보를 불러온다. } //좌표를 얻는데 실패했을 때 쓰이는 함수 function handleError() { console.log(“can’t not access to location”); } //날씨 api를 통해 날씨에 관련된 정보들을 받아온다. function getWeather(lat, lon) { fetch(`https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${API_KEY}&units=metric&lang=kr`).then(function(response) { return response.json(); }) .then(function(json) { //온도, 위치, 날씨묘사, 날씨아이콘을 받는다. const temperature = json.main.temp; const place = json.name; const weatherDescription = json.weather[0].description; const weatherIcon = json.weather[0].icon; const weatherIconAdrs = `http://openweathermap.org/img/wn/${weatherIcon}@2x.png`; //받아온 정보들을 표현한다. weatherInfo.innerText = `${temperature} °C / @${place} / ${weatherDescription}`; weatherIconImg.setAttribute(‘src’, weatherIconAdrs); }) .catch((error) => console.log(“error:”, error)); } init();

API KEY 얻는 방법

1. https://openweathermap.org/ 해당 날씨 api사이트에서 회원가입을 합니다.

2. 그리고 화면 상단에서 My API Keys로 가서 API KEY를 얻을 수 있습니다.

완성한 모습

깔끔하게 날씨가 뜨는 것을 알 수 있습니다.

몰랐던 점 & 해결법 css – flex로 div태그 정중앙에 배치하기

api 사용하기 – JS fetch함수 – https://www.daleseo.com/js-window-fetch/

날씨 api 사용법 – https://openweathermap.org/current#data 섭씨,화씨 언어 아이콘 사용법 – https://openweathermap.org/weather-conditions

컬러는 어디서? https://material.io/resources/color/#!/?view.left=0&view.right=0 해당 사이트에서 컬러를 고를 수 있다.

현재 위치 가져오는 법 – navigator – https://csdrive.tistory.com/17

참고한 사이트

#190820. 날씨 앱 만들기 (1)

그러다가 또 다시 새로운 강의를 발견했어요.

오늘의 날씨! 그게 바로 제가 만들어 갈 자그만한 프로젝트가 되지 않을까 싶습니다.

일단 프로젝트부터 만들어야하겠죠?

build.gradle에서 사용할 implementation 정의로 시작합니다.

자! OpenWeather이라는 API를 사용할 거예요.

날씨를 얻어오는 건 이 녀석에게 맡겨줄 겁니다.

회원가입하고 API 키 생성 이 아이디를 넣어줘서 접근하도록 할거예요 Retrofit을 만들어주는 과정입니다. 사이트에서 받은 관련된 정보입니다. 인터페이스 하나 만들어주고 오늘은 여기서 끝!

플러터로 기상청 날씨 앱 만들기 일지 1. UI 디자인

UI 디자인 구상

UI 디자인의 이해

UI 디자인은 위젯을 배치하는 방식으로 이루어진다.

대강 위의 그림과 같이 위젯이 위젯을 감싸는 식으로 원하는 UI를 구현할 수 있다.

Container는 child를 하나밖에 가질 수 없고 Stack, Colun, Row는 child를 여러 개 가질 수 있다.

나는 mainAxisAlignment로 배치를 편하게 할 수 있도록 작은 컴포넌트까지 container로 감싸는 식으로 UI를 구현했다.

코드 분석

코딩셰프 강좌를 통해 만든 날씨앱을 활용하여 앱을 제작하기로 했으므로, 배운 코드를 활용하기 위해 우선 코드분석부터 했다.

(코드 링크: https://github.com/zlecoding/Flutter-app-weather_app)

파일 트리 구조

│ main.dart

├─data

│ my_location.dart

│ network.dart

├─model

│ model.dart

└─screens

loading.dart

weather_screen.dart

파일 구조

main.dart

home : loading.dart 파일의 Loading 위젯을 호출

loading.dart

Loading class : stateful widget initState(): 가장 처음 실행되는 함수. getLocation() 호출. getLocation() MyLocation myLoca tion = MyLocation (); ☞ 사용자의 위치 정보를 받아오기 위해 my_location.dart 파일의 MyLocation 클래스 인스 턴스를 생성. Network network = Network(날씨 api url, 미세먼지 api url); ☞파싱된 json데이터를 받아오기 위해 network.dart파일의 Networt 클래스 인스턴스를 생성. Navigator를 이용해 weather_screen.dart 파일의 WeatherScreen로 페이지 이동. 이동 시 getLocation()에서 생성된 날씨데이터와 미세먼지 데이터를 전달. Widget build: 로딩 인디케이터 위젯

: stateful widget

my_location.dart

MyLocation class : 현재 사용자의 위치 정보를 받아오는 클래스

network.dart

Networt class : 날씨와 미세먼지 데이터를 받아와 statusCode가 200일 때만 json을 파싱해서 리턴하는 클래스

weather_screen.dart

WeatherScreen class : stateful widget initState(): updateData() 호출 updateData(): 필요한 json 데이터를 변수에 저장 getSystemTime(): 현재 시각을 불러오는 메소드 Widget build: UI 구성 + UI에 필요한 데이터를 변수로 setup하여 화면에 출력

: stateful widget

model.dart

Model class W idget getWeatherIcon(): 날씨 상태를 수치화하여 해당하는 svg파일을 불러온다. Widget getAirIcon(): 미세먼지 상태를 수치화하여 해당하는 이미지 파일을 불러온다. Widget getAirCondition(): 수치화된 미세먼지 농도에 따라 미세먼지 상태를 나타내는 텍스트를 적절히 불러온다.

대강의 흐름은 아래와 같다.

loading(앱 실행시키자마자 내 위치 가져온 뒤 api에서 내 위치 관련 데이터 얻어오기) ▶ weather_screen(ui 구성해서 필요한 정보를 보여주도록 한다.)

loading ▶ network (내 위치 받아오기, 정상적으로 위치를 받아왔을 경우 해당 위치를 콘솔창에 출력하고 정상적으로 위치를 받아오지 못했을 경우에는 오류 메시지를 출력)

loading ▶ network (데이터 파싱 시 정상적인 출력일 경우 데이터를 리턴하고 아닐 경우 오류 메시지 출력)

weather_screen ▶ model (날씨 상태를 수치화하여 해당 수치에 부합하는 이미지 출력)

디자인 시작.

일요일 디자인 1차

1. 영상 따라하지 않고 혼자 해보려니 UI부터 힘겹다.

UI도 UI지만 안에 들어가는 아이콘들 찾아보고 오픈소스 라이선스 찾아보는 데 시간이 더 많이 걸렸다.

컨텐츠 구성에 시간이 더 많이 들어간다는 말은 정말 팩트…

2. 오픈소스 라이선스 고지에 관한 내용이 정말 없다. 검색해도 많이 안 나옴. 대체 긴 라이선스는 어떻게 넣는 건지ㅜㅜ

Navigator.of(context).push( MaterialPageRoute(builder: (_) => LicensePage()

위 코드를 사용하면 추가된 라이브러리들과 오픈소스들을 구글이 알아서 정리해 준다. 그런데 내가 추가할 수 있는 방법은 없는 건가? 찾아봐도 안 나와서 너무 답답하다…

☞ 해결

void initMyLibrary() { LicenseRegistry.addLicense(() async* { yield const LicenseEntryWithLineBreaks([‘추가할 라이센스 이름’], ”’ 라이센스 내용… ”’); }); }

위와 같이 표기해서 함수를 실행시키면 라이센스 페이지에 내가 원하는 라이센스를 표기할 수 있다. 그런데 이제 문제는 지우는 법을 모르겠다…

하나 추가했다가 실패해서

LicenseRegistry.reset();

했더니 이전 라이센스 표기들이 다 날아갔다. 다시 복원해 보려다가 포기하고 새로 오픈소스들 표기해서 함수를 실행해 라이센스 목록에 내가 추가하고 싶은 사항들을 추가했다.

일요일 디자인 2차(완성)

디자인을 계속 변경했다.

본격적으로 값을 연결하면서 디자인은 더 바뀔 것 같다.

참고한 사이트 목록

배경화면 만들기 사이트

https://coolbackgrounds.io/

아이콘 사이트

https://orioniconlibrary.com/

배경화면 사이트

https://unsplash.com/

디자이너, 날씨앱 개발하기

저는 만드는 것을 좋아합니다. 나무, 가죽, 종이, 회로기판, 자석, 3D 프린팅, html, js, nodejs.. 어떤 재료나 방식이든 상관없이, 각각의 전문가는 아니지만 뭔가 만드는 것을 좋아합니다. 특히 쓸모가 있는 물건이나 작동하는 것들이요.

예전부터 모바일 앱을 만들어보고 싶었습니다. 개발에 대한 지식이 거의 없지만 인터넷을 검색해가며 js, node 등을 조금씩 익히며 원하는 웹페이지나 챗봇 같은 것을 만들 수 있었습니다. 하지만 모바일 앱은 그 벽이 너무 높았습니다. iOS앱을 개발할 수 있는 언어인 Objective-C나 Swift로 기본적인 앱 만드는 예제를 보며 시도해봐도 구조가 잘 이해되지도 않고, 개발툴인 Xcode 사용법도 잘 모르겠더라고요.

그런데 React Native를 알게 되었습니다. 그리고 노마드코더의 ‘날씨앱 만들기’ 영상을 보며 내 휴대폰에서 실제로 동작하는 앱을 만들 수 있었습니다. 앱 개발을 배워보고 싶은데 엄두가 나지 않는 디자이너라면 React Native를 한번 시도해보시는 것도 좋을 겁니다. 뭐가 어쨌든, 눈에 보이는 텍스트들의 생김새가 html, js와 비슷합니다. 개발을 위한 복잡한 툴이나 과정도 거의 필요 없습니다. 그냥 코드 에디터로 작성하고, 터미널에서 실행하면 됩니다. 그리고 React Native를 사용한 개발-배포를 너무나도 쉽게 만들어주는 Expo라는 toolchain이 있는데, 이것을 사용하면 개발도 더 손쉽게 할 수 있고(다양한 기본 라이브러리들), 개발 외의 복잡한 여러 환경과 준비사항들(앱 정보, 스토어에 등록하기 위한 준비, 증명서 등등)을 알아서 처리해줍니다.

그 후 제가 디자인한 날씨앱을 React Native로 직접 개발해서, 앱스토어와 구글플레이에 올리게 되었습니다. 물론, 제가 원하는 기능을 개발하기 위해서 구글링도 많이 하고 오랫동안 시간을 들여야 해서 개발을 완료하는 데는 시간이 오래 걸렸습니다 :O

지난 12월, 우붓에서 머물면서 기존에 만들었던 날씨앱의 디자인과 개발을 새로 했습니다. 작은 동네에서 3주 동안 할 게 없으니 집중이 잘 되었죠.

처음 앱을 만들 때는 개발을 하는데 머리를 다 쓰다 보니 디자인은 그냥 프로토타입처럼만 하고, 개발이 힘든 건 대충하고 했는데, 이번엔 제가 어디까지 가능하고 불가능한지 대충 파악을 했으니 리디자인을 하는 것에 집중을 했습니다. 물론… 새로운 기능들도 넣으려고 해서 개발을 하는 것이 머리가 아프기는 했지만요.

그래서 완성한 앱의 모습

아래와 같은 기능, 정보를 제공합니다.

현재의 온도와 대기질 수치

어제와 오늘, 내일의 날씨 비교

미세먼지, 초미세먼지 수치, 체감온도, 풍속, 해가 뜨고 지는 시간

한 주간의 일기예보

어제와 오늘, 내일의 날씨 비교는 pxd 무이 님의 글과 디자인을 많이 참고했습니다. 무이님은 참 대단한 분입니다!

그리고 대기질 상태에 따라 배경색이 바뀌는 것은 미세먼지정보 앱으로 유명한 ‘미세미세’를 참고했습니다. 그 전에도 대기질정보제공 서비스에 이런 디자인이 있었는지는 모르겠지만, 즉각적으로 상태를 확인하는데 딱 좋았습니다.

주요 기능들에 대한 디자인은 이렇게 기존에 있었던 것들을 잘 엮으려고 했고, 전체적인 그래픽디자인은 (제가 정리할 수 있는 능력 안에서)정보를 정확히 확인할 수 있는 정도로만 하려고 했습니다. 그래픽 디자인을 전공하지 않아서 한계가 있고, UI가 복잡해지면 개발하기도 어렵기 때문입니다. 처음엔 터미널 같은 화면에 정말 텍스트만으로 구성된 형태로 할까 생각했다가, 그러면 강약도 없고 정보가 제대로 전달되지 않으리라 생각되어 바꾸게 되었습니다.

진행했던 프로세스

맨 처음 개발을 배우기 시작할 때부터 지금까지 진행했던 전체적인 프로세스를 정리하면 아래와 같습니다. 모바일앱을 서비스하는 스타트업의 프로세스와 비슷합니다. 1,2번은 빼고요.

1. 개발의 기본적인 것 익히기

뭐든 예제를 보고 따라 해서 성공해보기

2. 만들고 싶은 앱 정하기

날씨, 미세먼지 앱을 만들어보자!

3. 기본 기능이 되는지 개발 테스트해보기

대기질 정보 API를 제공하는 곳이 있을까? 그 데이터를 받아와 화면에 표시할 수 있을까?

4. 디자인하기

5. 디자인한 것 중, 개발해보지 않은 것들이 가능할지 알아보기

내가 Pagination을 할 수 있을까? 세팅페이지에서 값을 바꾸고 저장하고 메인페이지에 돌아오면 그 세팅 값이 반영되게 할 수 있을까?

6. 디자인 수정하기

개발 가능한 만큼으로 디자인 수정하기

7 개발하기

작은 단위 하나하나 개발해서 확인한 것들을 하나로 묶는다. 이것도 매우 난관이다

8. Google Analytics 넣기

일단 언제 쓰게 될지 모르더라도 빠짐없이 다 로그를 남기도록 하자. 이제 Firebase가 더 좋을 텐데, Expo 개발환경에서 넣기는 어렵다

9 . 테스트하기

시뮬레이터로 해보고, 실제 폰에서 돌려보고 동작을 확인한다

10. 스토어에 올리기

스토어에 올리고, 그 버전을 테스트해본다. 제대로 동작하면 Release 한다

11. 마케팅

가만히 있으면 유저들에게 노출조차 되지 않는다. 내 앱을 알릴 수 있는 행동을 해야 한다

12. 수치 관찰

앱스토어, 구글플레이의 통계들을 확인하고, Google Analytics의 통계를 확인해보며 관리한다. 중국, 미국에는 알린 적이 없는데 다운로드가 일어나고 있다. 다음엔 중국인들을 대상으로 마케팅 해야지!

13. 유저들의 피드백 반영

스토어 리뷰나 커뮤니티의 댓글들을 보며 피드백을 반영한다. 체감온도와 풍속을 추가해달라던가, 수치가 잘못된 것 같다는 피드백 등등..

배운 점

디자인에 빠진 케이스들이 많다

디자인한 것을 실제로 구현할 때에는 생각보다 반영해야 할 케이스들이 많았습니다. 스타트업에서 이미 경험했던 것들도 가끔 까먹게 됩니다. 그러니 당연히 테스트케이스 작성과 QA과정이 필요한거겠죠. 그리고 거기서 배운 것들을 다음에 디자인할 때는 더 잘 처리해야 합니다…고 다짐합니다.

0~23시간 그래프에 현재 시각 위치 위에 수치를 표시하고 싶다. 그러면 0일 때와 23일 때에는 어느 위치에 가게 해야 하는가? 그냥 위에 표시하면, 그래프 영역을 벗어날 수 있다

0~23시간 그래프에 날씨 아이콘을 표시하고 싶다. 날씨가 전 시각과 다를 때에만. 그런데 0~23시간 그래프는 좁고, 날씨 아이콘 하나는 2시간 이상의 영역을 차지한다. 전 시각과 현재 시각의 날씨가 다르면, 아이콘을 겹치게 표현해야 할까? 아니라면, 어떤 아이콘을 표시해야 할까?

구현을 할 때는 생각대로 할 수 없다

개발의 한계도 아니고, 외적인 한계들이 있는 경우들도 있습니다. 그런데 저와 같은 디자이너들은 역할 상 그것을 파악하기 힘든 경우들이 있습니다. 그렇다고 그런 것들을 개발자나 다른 누군가 당연히 해줘야 하는 것이라고 생각해서는 안되기는 합니다. 함께 잘 파악하고, 의사소통 해야겠죠. 물론 그것들을 더 잘 파악할 수 있는 건 실제로 붙이고 만들어야하는 개발자이기는 합니다. 친절한 개발자라면 그런 한계 상황들을 잘 설명해주겠죠.

앱이 Foreground에 있는 동안, 10초에 한 번씩 자동으로 현재 온도와 대기질 정보를 업데이트하고 싶다. 하지만 날씨정보 API를 한번 호출할 때마다 돈이 든다. 그렇게 할 수 없다

주소를 표시할 때 ‘역삼역 > 역삼동, 강남구, 서울특별시’ 이렇게 (한국사람들이 익히 알고 있는) 정확한 레벨들을 표시 하고 싶다. 하지만 나라와 지역에 따라 제공하는 주소 레벨들의 정의가 다르다. 어쩔 수 없이 대략의 케이스들을 나누어 비슷하게 표시하고, 그 외 상황(else)을 만들어 대처해야 한다. 물론 더 좋은 유료 API를 사용하면 그런 문제도 자동으로 해결되겠지만….

개발을 하는 것은 어렵다

그냥, 생각보다 어렵습니다. ㅠㅠ

그리고 뿌듯합니다. 물론 엉망진창인 코드겠지만, 제가 아는 범위 내에서 구조가 잘 정리되어 있고, 잘 연결된 모습을 보면 잘 디자인된 스케치, 흐름을 보고 있는 것 같습니다.

더 나은 UI를 위한 개발은 미루게 된다 (배운점인가?)

사실 지금도 MVP 정도에 가깝습니다. 개선하고 싶은 것들이 군데군데 있지만, 머리를 좀 식히고 유저들의 반응을 보고 개선을 하려고 합니다…하고 자기합리화를 하며 뒤로 미루고 있습니다. 가장 개선하고 싶은 것은 로딩 및 인터랙션 간의 UI Animation인데, 아직 손을 대지 못하고 있습니다. 한 번도 개발해보지 않은 것이라 시간을 들여 공부를 해야 하기도 하고요. 데이터를 받아와 표시하고, 구조들끼리 연결되고 기능이 제대로 동작하는 것은 뿌듯한데, UI를 위한(유저들을 위한) 기능들은 미루게 됩니다. 개발자들도 어느 정도는 이런 비슷한 마음이 있지 않을까요. 특히 시간에 쫓기거나 지친 상황이라면요. 스타트업에 3년 넘게 있으면서 개발자들에게 많이 동화되었지만, 앱을 실제로 개발할 때 제는 디자이너가 아니라 딱딱한 개발자처럼 생각하게 되었습니다. 물론, 제가 있던 스타트업 개발자들은 이런 ‘더 나은 UI를 위한’ 것들을 잘 개발해주었습니다. 특히 데이터 근거와 ‘유저들에게 더 낫겠다’고 수긍할 수 있는 디자인이라면 더욱더.

…한번의 과정을 끝내고 나니 제가 괜한 핑계거리를 찾으려고 한 것 같습니다. 개발자분들 죄송합니다 (–)(__)

이야기 정리

코드도 개발자가 보면 분명 엉망진창일 것이고, 디자인이 완벽한 것도 아니긴 하지만, 어쨌든 끝까지 만들었습니다. 뭐든 만드는 일은 그럴 것이라 생각합니다. 당연히 전문가에게 맡겨야 할 것들도 있겠지만, 전문가만큼 만들지 못한다고 해서 해보지 못할 것들은 없다고 생각합니다. 가죽으로 배터리 케이스를 만든다던가, 나무로 모니터 받침대를 만든다던가, 내가 디자인한 MP3 플레이어를 만든다던가, 슬랙봇을 만들던가… 잘못하면 위험하거나 남에게 해를 끼치는 것들이 아니라면 직접 만들어 볼 수 있습니다! 그러다 관심이 생기면 더 깊게 공부하고요.

하지만 처음에 이야기했던 것처럼, 모바일앱을 만드는 것은 장벽이 너무 높습니다. 그래도 React Native + Expo로 간단한 앱을 만드는 것을 해본다면, 지난번 슬랙봇 만들기처럼 ‘초반의 성공에 대한 기쁨’을 맛볼 수 있을 겁니다. 그리고 이것저것 해보다 보면 뿌듯함도 느껴지고, 아주아주아주 작은 부분이지만 개발에 대한 이해도 조금 할 수 있을 겁니다.

하지만 역시나, 다운로드 수는 제 마음 같지 않습니다. 무수한 초기 스타트업들의 가장 중요한 고민이겠죠. 서비스의 컨셉과 디자인과 개발이 아주 멋지고 잘 되었더라도, 좋은 제품이더라도, 유저들에게 보여지지 않으면 의미가 없습니다. 적당한 가격에 기능성도 있고 아주 잘 만들어진 스툴이라도, 고객들에게 알려지지 않으면 의미 없는 제품이 되죠. 대신 유명 디자이너가 디자인한, 일반적인 스툴과 별다를 게 없는 스툴은 여기저기 화제가 되고요. 이케아같이 널리 알려진 매장에서 파는 스툴은 그냥 많이 팔리고요. 역시, 요즘 시대는 마케팅과 플랫폼이 중요합니다. 현혹하기 위해서가 아니라, 어떻게든 알리는 것이 필수니까요. 그래서 당분간은 앱 개선은 중단하고(자기합리화) 앱을 알리기 위한, 다운로드를 늘리기 위한 시도들을 해보기로 했습니다. 이럴 때 Google Analytics와 애플, 구글에서 제공하는 Store들의 Statistics들이 필요하죠!

다음에 좋은 운영 지표들이 생겨서, 그것에 대한 글을 쓸 수 있기를 기대하며 글을 마칩니다.

아, 앱은 아래의 링크로 다운받을 수 있습니다 😀

iOS 앱스토어 링크

Android 구글플레이 링크

키워드에 대한 정보 날씨 앱 만들기

다음은 Bing에서 날씨 앱 만들기 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1

  • 플러터
  • flutter
  • 코딩
  • 코딩강좌
  • 플러터강좌
  • 초보자
  • 코딩학습
  • 퓨시아
  • fuchsia
  • 구글
  • 안드로이드
  • 크롬
  • 날씨앱
  • weather app
  • api
  • geolocator
  • widget life cycle
  • 위젯생명주기
  • 생명주기
  • 코딩셰프
  • 코딩쉐프
  • permission
  • manifest
  • xml
  • ios
  • info.plist

플러터(Flutter) # #조금 #매운맛🌶️ #강좌 #13 #| #날씨 #앱(weather #app) #만들기 #1


YouTube에서 날씨 앱 만들기 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 플러터(Flutter) 조금 매운맛🌶️ 강좌 13 | 날씨 앱(weather app) 만들기 1 | 날씨 앱 만들기, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment