반응형
반응형

Top 10 Most Popular Flutter Open Source Apps in 2023

https://instaflutter.com/flutter-tutorials/flutter-open-source-apps/

 

Top 10 Most Popular Flutter Open Source Apps in 2023 - Instaflutter

In this blog post, we are going to explore some of the best open-source Flutter app templates that cannot be missed by the Flutter developers. Flutter is a popular cross-platform mobile application development framework that Read more…

instaflutter.com

 

Now, let us take a dig at the 10 most amazing open-source Flutter apps that you can use freely.

1. Natrium – Fast, Robust & Secure NANO Wallet



One of the most popular open-source applications; build for NANO cryptocurrency. The app is fully coded using Flutter framework/dart programming. Apart from the app’s functional capability, we should definitely take a look at its UI build. This dark-themed open-source application provides intuitive and modern UI design and looks. It is a fairly quick, robust, and secure wallet application that can be used from trading NANO. Along with an efficient mechanism to share QR codes to receive the NANO it also houses an intuitive mechanism to add contact information easily. The push notification service notifies users of any updates and while receiving the NANO.

The overall app is easy to use and can be an inspiration to build other crypto-wallet applications. The backend is powered by Python running the Redis server. The application use state-of-the-art flutter widgets to give such a clean and modern look to the user interface that will clearly amplify the user experience. The logical and functioning features are readily coded using dart programming providing everything required for a simple crypto-wallet application.

source: https://github.com/appditto/natrium_wallet_flutter

2. Grey – Material designed music player developed in Flutter



When it comes to open-source music player application build using Flutter/dart framework, nothing might this Grey application. The application is build using a material design UI which gives a native Android look. The application can be only build for Android now as iOS implementation kept for further enhancement. The UI design is simply impeccable with a clean and fun interface for a music player. The app hosts screen for the song lists, album lists, artist lists in a grid view format. There is also a screen for album detail with listed songs. The actual player screen is just amazing.

All the audio player features are from the Flute-Music-Player plugin. The plugin provides all the audio player functionality like play (local files), stop, pause, seek, and shuffle. The plugin comes with built-in UI themes as well as album art UI. Integrated with such a full-fledged music player plugin, this application is a force to be reckoned with among the open-source Flutter music player application.

3. inKino – a multiplatform Dart project with code sharing between Flutter and web



If you are looking for a movie app developed using Flutter/dart programming, then this is inKino application takes the top place. It is a multiplatform Dart app for browsing movies and showtimes for Finnkino cinemas. The full repo shares code between the Flutter application and the web-based AngularDart web application. The application build is available for both Android and iOS. The UI delivers in terms of movie applications showing a grid-based view of the movies. The overall app UI provides an intuitive experience that every user can use easily. The application list the showtime schedules for movies available in the cinema based on the day and a particular time of the day. The movie detail screen is top-notch consisting of a video player feature for trailers, a gallery feature for images, and a showcase of all the cast for the movie.

The application can deliver a great idea to build your next movie application. It can also deliver inspiration to build various scheduling applications as well. Most importantly, the application is open-source which you can download and run in your system freely. The coding structure is also clean and easy to understand.

4. SpaceX GO! – Simple yet powerful, open-source SpaceX launch tracker



If you are a fan of SpaceX and want to follow any news regarding the latest news of the company, then this is the right app for you. Not only about SpaceX but here we are concerned with top Flutter applications and this application packs a punch in terms of UI build. The app is simple with an intuitive UI build. The app itself has powerful features built as a SpaceX launch tracker. This project aims to develop the ultimate SpaceX experience on a variety of platforms.

Fully coded using Flutter and dart programming, this open-source app provides a dark-themed UI with features concerned with SpaceX aircraft, rockets, spaceships, etc. The app displays a detailed list of past & upcoming launches. The push notification feature notifies users when the rocket leaves the launch pad. It consists of a vehicle catalog where you can read about all rockets, capsules & ships SpaceX has develop over the years. It even has the feature to track the spaceship which tells the position, speed & status of all active ships used by SpaceX. There is also a Tesla Roadster tracker that shows the orbit, speed & distance of Elon Musk’s Tesla Roadster. Every feature is equipped with a great UI build with impeccable features. This open-source app is the one to look at for Flutter developers.

5. Flutter Food Delivery Application Design



Sometimes we look for an app that we can customize easily with our own features. This open-source application delivers a food delivery app UI fully coded using Flutter/Dart. The open-source repo only delivers the UI but not the features. Hence, we can make changes and integrate the required features ourselves. The application is currently under development. But, if you just look at the UI of this food delivery app then you will definitely be impressed. The app’s overall UI looks vibrant and modern.

Currently, the application delivers a Home screen with a horizontal scrolling display of food type, and grid view of popular food items, a Food Details Screen with price and add to cart option along with all the details of the food item & Add To Cart Screen with an option for payment as well. Lastly, the Login and Registration screens are also great. The UI just delivers every aspect required to build the food delivery application and all that is left are the features. This app template can be a starting project for us to develop our own Flutter food delivery application.

6. News Buzz – News App created in Flutter using News API 


Well, we all love a news application that is simple and elegant in terms of user experience and does not contain much of a fuss. Here, is an open-source News application built in Flutter using News API for fetching real-time data. It is integrated with Firebase as the backend and authenticator. The features include a custom news feed based on selected sources, bookmarking and saving news articles, browse news based on different categories, search for particular news, as well as sharing articles. The overall app’s UI is built using material design specification which looks clean and simple. The app also facilitates a login feature using Google Sign-In authentication activated using the Firebase plugin. The news can be viewed in-app with the help of the Flutter Webview plugin. All the HTML, CSS, and JavaScript are loaded in the app itself to display the actual news page through the webview plugin.

This is a great example of simple Flutter applications that delivers in terms of clean, modern UI as well as some robust features. Flutter developers can learn a great deal from this application on the news app UI and features that can be integrated. This can be a great starting point to develop a professional-looking news application using Flutter/Dart programming.

7. Note Taking App made in Flutter with Sqlite 


Now here comes the utility app built completely using Flutter/dart. We all know how useful a note app can be for taking notes. This notes application is themed to provide a fun element to the overall experience of the app. The overall UI looks colorful, modern, and fun to look at. Of course, there is a high degree of intuitiveness to it as well. The notes are shown in list view or staggered grid view to make it look more modern. There is also a feature to select the color theme for each note. The colors can be an essential element to mark how essential the note is.

The app is completely offline with notes being stored in the SQLite database. There is also the feature of search functionality. The overall interface is clean and vibrant. It can be an inspiration for the Flutter developers in terms of UI and functionality. Such a wonderful application and the source code is available freely as well.

8. Deer – Minimalist Todo Planner app


One of the best applications built using Flutter/Dart programming that is completely open-source. This application represents one of the cleanest UI builds that I have ever seen which is completely white-themed. The app is a minimalist Todo planner app built around the idea of efficiency and a clean aesthetic. The UI build and the custom functionality it provides to set each to-do item is simply awesome. This app is basically an instant love for those who love to play around with UI builds in the Flutter ecosystem.

Essentially, this application is built around the bloc pattern which is a popular method to implement state management in the Flutter application. Hence, this application can be a great example to learn and get ideas to implement the bloc pattern for Flutter development. There is high customizability and feature addition to each To-do item. This can be one of the most feature-full To-do applications which are available free right now.

9. Flutter Grocery Shopping App  with WooCommerce API integration


Well if look into applications like Reddit and Quora, there are a lot of people asking for Grocery app templates. These types of applications are very popular and in high demand as well. Since the world is going digital, each grocery shop is looking for its own application. And, this application can be just what they are looking for. It is a Flutter Grocery Shopping app template with WooCommerce API integration. Any grocery shop owner can simply build this app into production or use the template to make easy customization. Since the app code is free to use, it saves cost and time for development. The app UI is simple and clean. There are all the features already integrated into the template that a grocery app needs.

The template delivers the layout without data flow and communication with the backend system. There is the integration of payment gateway as well. Apart from all the features that it provides for online Woocommerce based grocery applications, it also presents an intuitive UI with a grid-based layout to display the grocery items. There is also a categorical display or search option available with a seemingly well-equipped filter system. Each item is list displays the price and add to cart button which also leads to the item detail screen. The add to cart screen then transitions to the checkout screen to make a payment transaction. It is surprising to believe that such a well-equipped application is available in the market for free.

10. WooCommerce App: Label StoreMax


Now here is a state-of-the-art Woocommerce application named Label Storemax which is available in stores as well. It is basically an App Template for WooCommerce stores completely build using Flutter/Dart programming. It is integrated to work with WooCommerce stores and API. The app UI features a clean and modern look completely white-themed. This can be a starting point for creating your own Woocommerce application.

The features include WordPress-based login and register authentication mechanism. The app has caching system enabled with makes the app run smoothly and fast compared to other applications. This makes this template enable to handle high traffic and provide a consistent fluid experience to users. This application can easily connect to WooStore and pull items, categories, and shipping from the store which you can manage from WordPress admin. The application is also equipped with light and dark mode themes. This application can be a source of inspiration for the Flutter developers to learn about UI and feature integrations of eCommerce applications in the Flutter ecosystem.

반응형
반응형

https://medium.com/@gokhanvaris/flutter-performance-tricks-3c521de95114

Flutter Performance Tricks

In recent times, product owners have required excessive overall performance programs to keep their customers engaged with the app. Lagging and skipped frames annoy users and supply them with a horrific personal influence. As a result, having a feature-rich app imparting their personal behaviors to run clean packages is far more important. This blog post will guide you on how to enhance the flutter performance of your current app.

Avoid State Flutter Widgets

The common mistake all of us make is the usage of state flutter widgets for flutter app development at the beginning of the improvement process. Stateful widgets can be used if your utility has a large build function and you also want to rebuild. Setstate() and statefulwidget ought to be used to rebuild or update. Furthermore, for better flutter overall performance, avoid using it in entire widgets.

Use Const Keyword

The constant keyword functions as a regular, which is a type of flutter widget used to avoid during compilation. Const allows the use of more than one widget without reducing overall performance. Another advantage of using const is that it avoids rebuilding every time you use one-of-a-kind widgets.

const Color color= Color(0xFFFFFFFF); 
const Text('This is a text');

Try Using Async/Await

It’s very important to test at the time of improvement whether the code that is used in the application is synchronous or asynchronous. With the assistance of async/await, code can be written asynchronously inside the Flutter utility. Async code is hard to upgrade, and debugging the asynchronous code is likewise difficult. But the code’s readability increases when combined with async.

Display Frames Within 16ms

The show is split into two components: structure and image. Developers have 8 MS for the shape and another 8 MS for the photograph to render a 60 Hz show. Usually divide 16 ms similarly between shape and image for higher flutter performance in your utility. You must be wondering if the 16ms will affect the quality of the show. Don’t fear; 16ms will not affect the greatness of the show. It will do nothing to improve the machine’s battery life. Moreover, with 16 ms, you can get higher performance on smaller devices.

Rebuilding of Widget in AnimatedBuilder

Animation is one of the maximum attractive capabilities in any web or mobile application. It grabs the consumer’s attention, however on the same time, it decreases the performance of the software. Builders commonly use animationcontroller. But, it rebuilds a couple of widgets in animatedbuilder, and that’s the commonplace motive in the back of the sluggish flutter performance.

Avoid Build Method

Try to stay away from using the construct() technique, as it is highly priced and consumes masses of CPU electricity. Repetitive use of build() can lower flutter performance. To improve the overall performance of your current utility, divide the large widgets created with the construct() technique into smaller ones.

Now let’s learn more detailed information together!

반응형
반응형

[Flutter] 2023년의 Flutter: 전략 및 로드맵

 

https://medium.com/flutter/flutter-in-2023-strategy-and-roadmap-60efc8d8b0c7

 

Flutter in 2023: strategy and roadmap

A guide to our strategy and areas of investment

medium.com

오픈 소스 프로젝트로서 우리는 로드맵에 대해 투명할 때 고객에게 최상의 서비스를 제공한다고 믿습니다.

Flutter와 같은 기술을 채택하는 개발자의 경우 제품이 단순히 유용한 기능 집합을 제공하는 것만으로는 충분하지 않습니다. Flutter에 대한 의존성은 기술 세트와 코드베이스를 유지하기 위한 장기적인 노력이기도 합니다. 그렇기 때문에 설득력 있고 현실적인 비전과 방향을 명확하게 제시하는 것이 중요합니다. 우리(Google)가 Flutter에 투자하는 이유에 대해 더 많이 공유함으로써 우리의 미래와 방향에 대해 더 큰 신뢰를 얻고 귀하의 투자가 어떻게 우리의 투자를 연결하거나 보완할 수 있는지에 대해 더 명확하게 계획할 수 있기를 바랍니다.

따라서 우리는 오늘 2023년 전략 문서를 공유 하고 있습니다. 여기에는 우리의 목표 선언문과 기본 원칙이 명시되어 있고 올해 남은 기간 동안 수행할 주요 투자가 설명되어 있습니다. 필요에 따라 일부 사소한 편집(예: 상업적으로 민감한 데이터 또는 미발표 제품에 대한 참조)이 있으며 모든 계획과 마찬가지로 이것이 현실과의 첫 접촉에서 살아남을 것으로 기대하지 않습니다. 이 전략 문서는 우리가 작업 중인 기능에 대한 세부 사항이 추가된 Wiki의 엔지니어링 로드맵 과 함께 읽어야 합니다 .

마지막으로 위의 문장에서 'Flutter에서 작업하기 위해 Google에서 비용을 지불하는 사람들'로 읽을 수 있는 '우리'라는 단어 사용에 대한 중요한 참고 사항입니다. 우리는 Flutter 기여자가 Google에 고용된 사람들보다 훨씬 더 많기를 바랍니다. 우리는 이 협력에 끝없이 감사하고 있습니다.

 

As an open source project, we believe that we serve our customers best when we are transparent about our roadmap.

For developers who adopt a technology like Flutter, it’s not enough for a product to merely offer a useful set of features. A dependency on Flutter is also a long-term commitment to maintain a skillset and codebase. For that reason, it’s important that we articulate a vision and direction that is compelling and realistic. We hope that sharing more about why we (Google) invest in Flutter will give you greater trust in our future and direction, and allow you to plan with better clarity as to how your investments might connect or supplement ours.

We’re therefore sharing our 2023 strategy document today, where we express our statement of purpose and guiding principles, and describe the major investments that we plan to undertake through the remainder of this year. By necessity, there are some minor redactions (such as commercially-sensitive data or references to unannounced products), and like all plans, we don’t expect this to survive first contact with reality. This strategy document should be read alongside the engineering roadmap on our wiki, which adds further specifics around features that we’re working on.

In closing, an important note on the use of the word ‘we’ in the above sentences, which might be read as “those who Google pay to work on Flutter”. We hope that the Flutter contributors remain far more numerous than just those who are employed by Google, but we don’t claim to speak for the incentives that others have or the work that they might independently undertake. We’re unendingly grateful for this collaboration.

 
반응형
반응형

[Flutter] Flutter: the good, the bad and the ugly

https://medium.com/asos-techblog/flutter-vs-react-native-for-ios-android-app-development-c41b4e038db9

 

Flutter: the good, the bad and the ugly

Having created my first app using Flutter, I weigh up the technology’s pros and cons against React Native

medium.com


Flutter: 좋은 것, 나쁜 것, 추한 것
Flutter를 사용하여 첫 번째 앱을 만든 후 다른 대규모 크로스 플랫폼 개발 경쟁자인 React Native와 기술의 장단점을 비교했습니다.

반응형
반응형

[Flutter] Flutter 4.0 New Features

https://medium.com/@sajjadmakman/flutter-4-0-new-features-33bdd9b8c004

 

Flutter 4.0 New Features

Cannot wait for Flutter 4 . Well, This is a compiled list of what is coming to Flutter 4.0.Desktop New Features in Flutter 4.0

medium.com

 

Welcome to the Flutter organization https://github.com/flutter

 

Flutter

Flutter is Google's UI toolkit for building beautiful, natively compiled applications for mobile, web, desktop, and embedded devices from a single codebase. - Flutter

github.com

 

Flutter 4를 기다릴 수 없습니다. 음, 이것은 Flutter 4.0에 제공될 기능의 편집된 목록입니다. Flutter 4.0의 데스크탑 새로운 기능

Flutter 4.0의 데스크탑 새로운 기능

모바일 앱 개발 프레임워크인 Flutter는 곧 출시될 버전인 Flutter 4 및 Flutter 5에서 Microsoft 11 접근성에 대한 지원을 받을 예정입니다. 이것은 Flutter 엔진의 MSAA API에 대한 기존 지원에 추가됩니다. 개발팀은 이미 Flutter 4에서 이 기능의 토대를 마련했으며 나머지 작업은 Flutter 5에서 완료될 것으로 예상됩니다.

접근성 지원 외에도 Flutter 4에는 데스크탑 셸용으로 여러 창을 만드는 기능과 같은 새로운 기능과 데스크탑 지원에 대한 추가 개선 사항도 도입됩니다. 팀은 Flutter 이슈 프로젝트 20에서 추적할 수 있는 Flutter의 데스크톱 기능을 연마하는 작업을 해왔습니다.

전반적으로 이러한 업데이트를 통해 Flutter는 더욱 다재다능하고 접근성이 높아져 개발자가 다양한 플랫폼에서 원활하게 실행할 수 있는 고품질 애플리케이션을 만들 수 있습니다.

반응형
반응형

멀쩡한 앱을 Flutter 앱으로 다시 짠 이유 - 일본 1위 배달 앱, 두 번째 Recode

https://engineering.linecorp.com/ko/blog/demaecan-2nd-recode-kmm-to-flutter

 

멀쩡한 앱을 Flutter 앱으로 다시 짠 이유 - 일본 1위 배달 앱, 두 번째 Recode

안녕하세요, LINE+ ABC Studio에서 앱을 개발하고 있는 김종식, 남상혁입니다. 저희 팀은 현재 일본에서 운영하는 배달 서비스 '데마에칸(Demaecan, 出前館)' 프로덕트를 개발하고 있습니다. '데마에칸(

engineering.linecorp.com

Flutter를 선택한 이유

데마에칸 서비스는 고유한 디자인으로 개발됐기 때문에 모바일 개발자 모두가 공통 UI 코드까지 작성할 수 있는 기술을 고민했습니다. 모바일 멀티 플랫폼 기술 중 온전히 앱 개발이 가능한 기술로는 대표적으로 RN과 Flutter가 있습니다.

Google Trends - Flutter vs React Native(in Japan) 

그 중 두 번째 Recode를 위한 기술로 Flutter를 선택한 이유는 다음과 같습니다.

  • Flutter는 최근 모바일 앱뿐 아니라 PC와 웹 개발도 가능하게 돼 플랫폼 확장성을 확보할 수 있었고, 기술 공개 후 빠르게 발전하고 있어서 필요한 정보를 보다 수월하게 획득할 수 있을 것이라고 판단했습니다.
  • 공통 코드로 UI를 구성할 수 있으며 자유도가 높았습니다. 특히 KMM 개발 당시 Android Compose UI 개발 만족도가 높았던 터라 선언형 UI 패러다임으로 완전히 전환하고자 했던 저희 목적에 부합했습니다.
  • 네이티브 대비 성능 부분에서 위험성이 낮았고, 네이티브 기능을 개발할 때는 MethodChannel을 활용하면 크게 제약 받는 부분이 없었습니다.
  • 통합 개발 환경(IDE) 부분에서 팀 원 모두에게 익숙한 Android Studio를 활용할 수 있었습니다(참고). 


Flutter로 다시 갈아엎자 ㅆ (←웃는 눈 모양입니다)

Flutter는 Dart 언어를 사용합니다. 따라서 Dart 언어에 익숙해지지 못하면 Flutter로 제대로 개발할 수 없습니다. 이때 Dart tour 문서를 참고하면 언어 특징을 빠르게 훑어보기 좋습니다. Dart 언어의 상세한 부분까지 잘 소개한 문서입니다. Dart 언어를 개략적으로 이해한 후에 Flutter Codelab 페이지를 읽어보면 Flutter를 보다 쉽게 이해할 수 있습니다.

Recode는 Dart 언어를 익히고 Flutter에 익숙해지는 것으로 시작해서 시작부터 출시까지 약 3개월 정도 진행했습니다. 제한된 기간 내에 1.0과 3.0 모드를 모두 제공해야 했으므로 공식 문서를 보며 Dart와 Flutter를 학습하면서 동시에 스펙 - 뷰 상태 - 로직을 잘 분리해 나가며 학습과 개발을 동시에 진행했습니다. Recode 시작 당시에는 Flutter SDK 3.0.2이었고, 출시할 즈음에는 Flutter SDK 3.0.5로 개발했습니다.

Flutter는 선언형 UI 개발을 하기 때문에 가장 큰 고민 거리는 UI 상태 관리입니다. 상태 관리와 관련해서 provider bloc, getx 등의 패키지가 있는데요. 처음 Recode를 시작할 때 패키지 학습 비용 및 패키지 의존성으로 인한 부담 때문에 직접 구현하는 형태로 진행했습니다. 상태 변경을 위해서 ChangeNotifier를 활용했고, 상태 집단은 StateModel로 관리했습니다. 제품 개발에 반드시 필요한 패키지(예를 들어 FlutterFire, google_maps_flutter 등)가 아니라면 가급적 직접 구현하는 것을 원칙으로 정했습니다.

 

KMM과 비교해 구현 난이도가 높았던 사례

Flutter로 갈아엎으면서 KMM과 비교해 구현 난이도가 높았던 부분도 있었습니다. 권한 획득이나 푸시 수신 시나리오 같은 경우 각 플랫폼에서 제안하는 개발 가이드라인에 차이가 있는데요. KMM 때는 네이티브 영역을 각각 구현해 코드 복잡도가 높지 않았는데 Flutter로 변환하면서 하나의 코드로 작성하다 보니 플랫폼에 따른 분기 코드가 종종 발생해서 코드 가독성을 저해하는 부분이 있었습니다. 아래는 Flutter로 변환한 후 Android와 iOS 앱 실행 후 흐름입니다. 

  • Android 앱 실행 흐름

  • iOS 앱 실행 흐름

플랫폼별로 SDK나 패키지 작동이 달랐던 사례

플랫폼별로 SDK나 패키지 작동이 기대와는 조금씩 달랐던 경우도 있었습니다. 예를 들어 앱 내 진동 효과를 발생시키는 코드를 플랫폼별로 다르게 구현해야 하는 경우입니다. Android는 Vibration 패키지에서 제공하는 인터페이스를, iOS에서는 Flutter SDK에서 제공하는 인터페이스를 사용하는 것이 요구 사항에 가장 적합하게 작동했습니다. 스펙에는 진동이 300ms, 500ms, 1000ms와 같은 방식으로 정의돼 있었는데 플랫폼별로 작동에 차이가 있어서 이를 구현할 때 분기가 필요했습니다. 

de_theme_effect.dart

void _vibrate300() async {
    if (PlatformUtils.isAndroid) {
        if (await Vibration.hasVibrator() == true) {
            Vibration.vibrate(duration: 300);
        }
    } else if (Platform.isIOS) {
        HapticFeedback.lightImpact();
    }
}
 
void _vibrate500() {
    /// implements
}
 
void _vibrate1000() {
    /// implements
}
Dart

위와 같은 코드는 Recode 출시 후 단계적으로 추상화하며 플랫폼별 구현체로 리팩토링하고 테스트 코드를 작성하면서 보다 가독성이 높고 유지 보수하기 좋은 형태로 변경하고 있습니다. 아래는 위 코드를 개선한 결과입니다.

de_theme_effect.dart

// The interface is reused.
void _vibrate300() => VibrationHelper.vibrate(VibrationEffect.effect300);

...

enum VibrationEffect { effect300, effect500, effect1000 }

class VibrationHelper {
	// vibration only support Android, iOS platform.
	static void vibrate(VibrationEffect effectType) {
		// Note) PlatformUtils also an abstract class of each platform implementations.
		if (PlatformUtils.isAndroid) {
			_vibrateAndroid(effectType);
	    } else if (PlatformUtils.isIOS) {
			_vibrateIOS(effectType);
    	} else {
			log('${effectType.name} vibrate fail, Unsupported platform type');
		}
	}

	static void _vibrateAndroid(VibrationEffect effectType) async {
    	// implementation as a vibration package.
		if (await Vibration.hasVibrator() == true) {
			switch (effectType) {
				case VibrationEffect.effect300:
					Vibration.vibrate(duration: 300);
				break;
				case VibrationEffect.effect500:
					Vibration.vibrate(duration: 500);
          		break;
		        case VibrationEffect.effect1000:
          			Vibration.vibrate(duration: 1000);
		        break;
			}
		}
	}

	static void _vibrateIOS(VibrationEffect effectType) {
		// implementation as a flutter(default) package.
		switch (effectType) {
			case VibrationEffect.effect300:
				HapticFeedback.lightImpact();
			break;
			case VibrationEffect.effect500:
				HapticFeedback.mediumImpact();
			break;
			case VibrationEffect.effect1000:
				HapticFeedback.heavyImpact();
			break;
		}
	}
}
Dart

트러블 슈팅 사례

두 번째 Recode 과정 중에 경험한 주요 트러블 슈팅 사례를 소개하겠습니다. 

Google 지도 관련 이슈

먼저 Google 지도와 관련해서 발생한 두 가지 이슈를 소개하겠습니다.

의존 관계 업데이트 후 사이드 이펙트로 앱 성능 저하

배송원 앱에서는 배송원 위치와 가맹점 위치, 고객 드위치를 지도 위에 마커로 표시합니다. 지도는 Google 지도(google_maps_flutter) 패키지를 사용하고 있고, Google 지도를 사용하기 위해 아래와 같이 pubspec.yaml에 Caret 문법를 활용해 의존 관계를 추가해 놓았습니다. 그런데 어느 순간 앱 성능이 급격히 저하되는 이슈가 발생했고, 확인 결과 google_map_flutter 버전이 올라가면서 각 플랫폼 구현체 의존 관계가 업데이트된 것을 확인할 수 있었습니다. 이슈 발생 전후 pubspec.lock을 비교해 보면 아래와 같습니다. 

정상 작동 시 pubspec.lock

google_maps_flutter:
  dependency: "direct main"
  description:
    name: google_maps_flutter
    url: "https://pub.dartlang.org"
  source: hosted
  version: "2.1.9"
google_maps_flutter_platform_interface:
  dependency: transitive
  description:
    name: google_maps_flutter_platform_interface
    url: "https://pub.dartlang.org"
  source: hosted
  version: "2.2.1"
YAML

성능 이슈 발생 후 pubspec.lock

google_maps_flutter:
  dependency: "direct main"
  description:
    name: google_maps_flutter
    url: "https://pub.dartlang.org"
  source: hosted
  version: "2.2.0"
google_maps_flutter_android:
  dependency: transitive
  description:
    name: google_maps_flutter_android
    url: "https://pub.dartlang.org"
  source: hosted
  version: "2.3.0"
google_maps_flutter_ios:
  dependency: transitive
  description:
    name: google_maps_flutter_ios
    url: "https://pub.dartlang.org"
  source: hosted
  version: "2.1.11"
google_maps_flutter_platform_interface:
  dependency: transitive
  description:
    name: google_maps_flutter_platform_interface
    url: "https://pub.dartlang.org"
  source: hosted
  version: "2.2.2"
YAML

이슈 발생 원인은 google_map_flutter가 2.2.0으로 버전이 올라가면서 google_map_flutter_android 패키지 의존 관계가 업데이트돼 발생한 사이드 이펙트였습니다. 이슈를 해결하기 위해 pubspec.yaml에 선언한 google_maps_flutter 패키지 버전을 caret 문법 대신 고정된 버전을 사용하는 것으로 수정했습니다. 

pubspec.yaml

# AS-IS: Performance degradation due to version-up
dependencies:
	google_maps_flutter: ^2.1.3 // It means '>=2.1.3 <3.0.0'

# TO-BE: Specify as fixed version
dependencies:
	google_maps_flutter: 2.1.9
YAML

네이티브 영역에서 크래시 발생

Google 지도와 관련해 발생한 또 한 가지 이슈가 있습니다. 출시 후 Android 버전에서 crash-free(* 특정 기간 동안 비정상 종료가 발생하지 않은 사용자 비율)가 약 96~97%로 불안정한 상태가 지속됐습니다. Crashlytics 로그에서는 ByteBuffer나 Thread 등 네이티브 영역에서 크래시가 발생한 것으로 나타나 정확한 원인을 파악하기 힘든 상황이었는데요. 크래시 발생 시 생성된 로그를 분석한 결과 강제 로그아웃이 발생해 로그인 화면으로 전환될 때 이런 상황이 발생하는 것을 확인할 수 있었습니다. 배송원 앱은 로그인에 성공하면 Google 지도를 화면에 표시하는데 이때 화면 전환 등으로 지도가 표시되는 화면이 사라질 때 크래시가 발생하는 것으로 예상됐습니다.

이 이슈는 Google MapView의 Rendering 옵션을 LATEST로 사용하면 해결할 수 있는 것으로 알려져 있었습니다(참고). 이를 참고해서 Android 네이티브 소스 코드를 수정해 crash-free를 99% 이상으로 안정화할 수 있었습니다. 현재 google_maps_flutter_android 패키지 2.4.0 버전부터는 LATEST 렌더링 옵션을 제공하도록 개선돼(참고) Flutter 소스 코드에서도 렌더링 옵션을 수정할 수 있도록 업데이트됐습니다(이와 관련해 google_maps_flutter에 등록된 이슈를 참고하시기 바랍니다).

제스처 미작동 이슈

아래 화면은 배송원 앱의 주문 상세 확인 화면입니다. 이 화면에서는 크게 좌우로 스와이프해 페이지 닫기, PageView 내에서 좌우로 스와이프해 탭 화면 이동, Google 지도 내에서 핀치 줌(pinch zoom) 제스처가 가능합니다. 그런데 Android 기기에서 Google 지도 내 핀치 줌이 작동하지 않는 이슈가 발생했습니다.

   

제스처와 관련해 발생하는 문제는 두 가지였습니다.

Gesture Arena에서 여러 제스처가 경쟁해 Google 지도 제스처가 제대로 작동하지 않음

Gesture Arena에서 좌우 페이지 스와이프 제스처, 페이지 백 제스처, 상하 스크롤 제스처, 지도 제스처 등 여러 제스처가 경쟁해 Google 지도 제스처가 제대로 작동하지 않는 경우가 발생했습니다. 이때 Gesture Arena에서 경쟁하지 않고 즉시 모든 터치 이벤트를 받을 수 있게 하려면 gestureRecognizers에 EdgarGestureRecognizer를 추가해야 합니다.

EdgarGestureRecognizer는 일반적으로 AndroidView.gestureRecognizers에서 전달되며 뷰 범위 내 모든 터치 이벤트를 내장된 Android View로 즉시 발송하기 때문에 Gesture Arena에서 경쟁하지 않고 모든 터치 이벤트를 즉시 발송하므로 모든 터치를 전달받을 수 있습니다. Google 지도와 같이 모든 이벤트를 즉시 받아야 하는 뷰의 경우 유용하게 사용할 수 있습니다.

PageView 이동 시 첫 번째 페이지의 Google 지도에서 멀티 터치가 제대로 작동하지 않음

이 문제는 viewportFraction이 기본 값인 1.0인 경우 페이지가 완전히 넘어갔다고 판단하지 않아서 포커스를 완전히 넘겨주지 않아 발생한 문제였습니다. PageView의 allowImplicitScrolling 프로퍼티 true로 설정해서 다음 화면 요소로 이동했다고 판단되면 포커스를 이동하도록 설정해 해결할 수 있었습니다.

텍스트 표시 관련 이슈

일본어 한자가 중국어 번체로 표시됨

iOS 기기 중 특정 기기에서 일부 문자가 일본어가 아닌 중국어(번체)로 표시되는 이슈가 발생했습니다. 예를 들어, '配達設定(배달설정)' 문구에서 일본어 한자('設')가 아닌 중국어 한자('設')로 표시되는 이슈로, 기기나 OS에서 제공하는 폰트마다 이런 이슈가 있을 것으로 예상했습니다. 

배송원 앱 설정 화면 > 중국어 한자 표시 이슈

이 이슈를 해결하기 위해 스타일 프로퍼티(TextStyle)에 locale 프로퍼티를 각 언어에 맞게 잘 설정해 줬지만 해결되지 않았습니다. 이에 iOS 기본 폰트에서 일본어 한자를 제대로 지원하지 않는 경우가 있다고 판단했고, iOS의 fontFamilyFallBack 프로퍼티를 [.AppleSystemUIFont', 'Hiragino Sans']로 설정해 해결할 수 있었습니다. 아래는 코드 실행 결과입니다.

폰트별 '配達設定(배달설정)' 문구 표시 차이

Chinese Japanese
   
...
Column(
	mainAxisAlignment: MainAxisAlignment.start,
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
        Text(
			'配達設定 (배달설정)',
			style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)
		),
		Text(
            '配達設定 (배달설정)',
            style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)?.merge(TextStyle(
               fontFamilyFallback: Platform.isIOS ? const ['.AppleSystemUIFont', 'Hiragino Sans'] : null,
               leadingDistribution: TextLeadingDistribution.even,
            )
		),
	),
])
Dart

텍스트 크기를 최소 혹은 최대로 설정하면 화면이 제대로 표시되지 않음

iOS와 Android 앱은 기기 설정에서 디스플레이 및 텍스트 크기를 변경할 수 있습니다. 기기 설정에서 이 옵션을 최소 및 최대로 설정할 경우 화면이 제대로 표시되지 않는 이슈가 발생했습니다. 이를 수정하기 위해 디자인 팀과 논의해 MediaQuery 위젯을 이용해서 textScaleFactor를 0.7~1.4로 제한하고, 필요에 따라 고정된 텍스트 크기로 표시되는 위젯을 만들어 대응했습니다. 

DeWidgetLimitedScaleText

class DeWidgetLimitedScaleText extends StatelessWidget {
  final bool isScalable;
  final Widget child;

  const DeWidgetLimitTextScale({Key? key, this.isScalable = true, required this.child}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final mediaQuery = MediaQuery.of(context);
    return MediaQuery(
      data: mediaQuery.copyWith(textScaleFactor: isScalable ? min(1.4, max(0.7, mediaQuery.textScaleFactor)) : 1.0),
      child: child,
    );
  }
}
Dart

백그라운드 상태에서 FCM(Firebase Cloud Messaging) 수신 시 isolate 관련 이슈 

firebase_messaging 패키지를 이용하면 앱이 백그라운드에 있는 상태에서 FCM 푸시 수신 처리가 가능합니다(참고). 그런데 이때 SharedPreference에 접근할 경우 'When received, an isolation is spawned. Since the handler runs in its own isolate outside your applications context, it is not possible to update application state or execute any UI impacting logic.' 메시지와 함께 오류가 발생합니다. 

Dart 앱은 단일 스레드 프레임워크이며 스레드 대신 isolate에서 작동합니다. Isolate를 새로 만들고 서로 통신할 수는 있지만 각 isolate는 고유한 메모리 힙을 할당받기 때문에 공유하는 메모리는 없습니다. 백그라운드에서의 푸시 콜백은 새로운 isolate에서 전달하는 것이기 때문에 메인 isolate의 메모리 데이터를 사용할 수 없어서 위와 같은 오류가 발생합니다. 이 문제는 앱 디렉터리 하위에 JSON 형식의 파일로 데이터를 저장하고 관리할 수 있는 유틸리티를 만들어서 FCM 수신 시 로컬에 데이터 저장이 필요한 경우에는 이 유틸리티를 사용하는 것으로 해결했습니다. 

기술 변경으로 더욱 돈독해진 팀워크

두 번째 Recode 과정에서는 새로운 기술을 학습하면서 동시에 그 기술을 활용해 제품을 만들어 내는 과정을 진행했습니다. Flutter 기술을 완벽히 이해하고 있지 않아서 여러 가지 우려가 있었지만 결과적으로 긍정적인 피드백이 많았습니다. 두 번째 Recode 프로젝트 회고에서 KMM에서 Flutter로 전환한 결과 가장 좋았던 점으로 모든 분들이 공감해 주신 것은 동일한 소스 코드로 고민과 토론이 가능해졌다는 점이었습니다. 

KMM으로 개발할 때는 Android와 iOS, KMM 각 영역에서 개발자가 본인 업무에 해당하는 영역에서만 개발을 진행하면서 각자의 관심 기술에만 집중했고, 이는 결국 장기적인 관점에서의 협업 측면이나 기술 성장 측면에서 아쉬움을 남겼는데요. Flutter로 전환하면서 Flutter라는 기술과 Dart라는 언어를 이용해 함께 고민하고 학습하며 그 내용을 실제 프로덕트에 반영하는 기회를 얻었고, 그 과정에서 발생한 급박한 상황 역시 생각보다 더 긍정적으로 회고됐습니다. 저희와 같이 소수(3~4명) 인원이 하나의 앱을 개발할 때는 같은 언어로 함께 고민하며 프로젝트를 진행하는 게 성장과 협업 측면에서 더 큰 동기를 부여할 수 있다는 것을 느꼈습니다.

팀 전체 관점에서도 공감대가 넓어졌습니다. 데마에칸 서비스 중 배송원 앱뿐 아니라 가맹점 앱, 리테일 앱 역시 Flutter를 활용하고 있기에 팀 차원에서 기술 교류가 시작됐고, 각 앱에서 공통으로 사용하는 모듈도 개발 가능해져 협업 측면에서도 좋아졌습니다. IDE나 CI/CD 환경 혹은 각 프로젝트의 아키텍처를 공유할 수 있게 됐고, 리팩토링이나 테스트 코드 등도 함께 고민하고 공유할 수 있어서 개인은 물론 팀 전체가 함께 성장하는 데 큰 도움이 되고 있습니다(공통 모듈을 만들어 활용하고 있는 내용은 Flutter 패키지로 공통 모듈 리팩토링하기를 참고하세요).  🙂

마치며

모바일 앱 개발 기술로 Flutter를 고민하고 있다면 아래와 같은 이유로 추천합니다.

  • 한정된 자원으로 멀티 플랫폼 개발을 할 수 있습니다. Android와 iOS뿐 아니라 PC와 웹으로도 개발할 수 있어서 다양한 형태로 제품을 검증할 수 있고 QA 환경 구성에도 유리합니다.
  • 앱 개발자에게 멀티 플랫폼 기술은 네이티브 개발자에게 다음 단계를 도전하기 위한 큰 과제와도 같기 때문에 커리어를 쌓고 채용 시장에서 경쟁력을 높일 수 있는 좋은 기회라고 생각합니다.
  • 개인과 팀 모두 고민하고 성장하기 위한 환경을 고민하고 있다면 좋은 선택이라고 생각합니다. 

배송원 앱은 Recode 후 새로운 버전에서 사용자에게 더 좋은 가치를 안정적으로 제공하기 위해 Flutter로 모듈화하고 테스트 코드를 작성하는 것에 집중하고 있습니다. Flutter 개발자분들과 더 나은 상태 관리 방법과 효율적인 의존 패키지 버전 관리 방법, 보다 빠른 빌드 및 배포 자동화 구성 방법, 그리고 새로운 프로덕트를 더 잘 만드는 방법 등을 고민하고 있습니다(개발자라면 대부분 공감할 부분들이라고 생각합니다 🙂 ). 사용자에게 더 나은 서비스를 제공할 수 있다면 세 번째 Recode를 진행해야 할 상황이 오는 게 조금은 기다려지기도 한다고 생각하며 글을 마치겠습니다. 

반응형

+ Recent posts