Flutter

Flutter, Bài 12: Build release

Với những kiến thức đã được trình bày trong loạt bài về Flutter, tôi hi vọng bạn đã có thể viết được một ứng dụng đơn giản chạy được trên cả Android và iOS chỉ với một project Flutter duy nhất. Tuy nhiên, tất cả hiện tại cũng chỉ là ứng dụng dạng debug với code còn đầy đủ tên class, fields và methods. Để build ứng dụng ra phiên bản release, bạn không thể tìm tới mục Build và chọn Generate APK như đối với Android Sdk ngay cả trên Android Studio. Bài này sẽ hướng dẫn các bạn giải quyết vấn đề trên.

Flutter

1. Build cho Android

Như bạn có thể đã thấy, khi tạo một Flutter project, Flutter cung cấp cho bạn sẵn thư mục android, bên trong là một Android project hoàn chỉnh, gồm có các tập tin build.gradle, AndroidManifest, hay các thư mục như assets, res, v.v… Thực tế, đó là phần “Android” trong ứng dụng Flutter của bạn.

Tuy nhiên, thay vì làm theo hướng dẫn khá “lởm” của Flutter tại https://flutter.io/android-release/, tôi sẽ hướng dẫn cách làm khác nhanh, gọn, và quen thuộc hơn gấp trăm ngàn lần vì tôi đã quy ước chúng ta đang dùng Android Studio từ đầu loạt bài. Rất dễ dàng, bạn chỉ cần đóng Android Studio lại, Open new project, và mở vào thư mục android trong project của bạn là được. Tiếp theo đó, bạn có thể thay đổi Launcher Icon, xin quyền trong AndroidManifest và quan trọng hơn nữa, là build release với Build/Generate signed APK như bạn đã, đang và sẽ làm với một Android project dựng bằng Android Sdk. Hoàn toàn dễ dàng và không có gì phải xoắn như trong hướng dẫn chính chủ, vốn hỗ trợ cả VS Code.

Sau khi build xong, bạn có thể publish ứng dụng lên Google Play như bình thường. Nếu bạn chưa publish bao giờ, hãy xem hai bài viết hướng dẫn của tôi tại (1)(2).

2. Build cho iOS

Tôi hi vọng các bạn sử dụng Flutter để code cho iOS đã có kinh nghiệm ít nhiều với việc build iOS project viết bằng iOS Sdk trong Xcode. Và vì vậy, tương tự như trên, bạn chỉ cần mở Xcode lên, open thư mục ios (tập tin Runner.xcworkspace) trong Flutter project là được, vì thư mục ios là một iOS Project hoàn chỉnh và thực tế, đó chính là phần “iOS” của ứng dụng của bạn. Việc build ứng dụng Flutter hoàn toàn giống với bạn build ứng dụng iOS viết bằng iOS Sdk, tức bạn sẽ gặp lại Scheme và Archive đã quá “chai mặt”.

3. Đánh giá tiềm năng của Flutter và so sánh với React Native

Khi xem video về Flutter của hai “quý bà” Emily tại Google I/O 2017 (vâng, năm 2017, link gốc không che ở đây) thì tôi rất có ác cảm với Flutter, dù performance của nó cũng tương đối nhanh. Có lẽ lí do một phần là tôi đang thích React nên nghiêng về React Native hơn, phần khác là tôi đang giận con cá Angular mà chém luôn cả cái thớt Google bao gồm luôn Flutter, phần khác nữa là vì chưa quen với Dart và cảm giác của tôi lúc đó cho rằng Dart là một ngôn ngữ v/v, và cuối cùng là do hai diễn giả thuyết trình rất tệ.

Nhưng khi cảm thấy React Native không linh hoạt và performance không ngọt cho lắm (ý tôi là bản release đàng hoàng chứ không phải bản debug) và có khá nhiều Components chỉ được viết cho hoặc Android, hoặc iOS, tôi lại giở bàn phím ra và tiếp cận tới một giải pháp khác. Việc ứng dụng Flutter chạy trên engine của nó, và bản engine sẽ được trực tiếp thực thi ra byte codes cho target platform nên bạn không phải lo lắng khi dùng một Widget trên Android hay iOS, bởi chúng được viết để chạy trên nền engine trung gian kia. Đồng thời, bản thân tôi phải công nhận hiệu năng của Flutter là khá ngon và theo như “quảng cáo” của Google, thì giao diện có thể được render với tốc độ lên tới 120fps trên iPhoneX hay những chiếc Pixel 2, khá ấn tượng. Đây là một điều không hề dễ dàng cho các lập trình viên chỉ code iOS hoặc Android với bộ Sdk chính thức, đặc biệt là Android vốn rất phân mảnh. Một góc độ khác là tốc độ request của thư viện http khá cao và xử lí response cũng nhanh, nên bạn có thể sử dụng luôn thư viện gốc này mà không cần phải suy nghĩ về việc dùng Volley hay Retrofit như trên Android Sdk.

Ngoài ra, việc gọi native platform APIs trên Flutter cũng đơn giản hơn React Native, bạn chỉ cần đặt một method để invoke một method trên Android, và iOS, qua tên của chúng, tương tự như Java reflector. Nếu phần native methods của bạn trả về đúng kết quả cần thiết trên cả hai nền tảng trên, thì code của phần Flutter hoàn toàn không có vấn đề gì.

Tuy nhiên, phàm là vậy nhưng Flutter cũng đang đứng trước những thách thức không nhỏ. Đầu tiên phải kể tới Dart. Nếu bạn chịu khó tìm hiểu về Dart, bạn sẽ thấy nó rất hay và theo tôi, là nó chứa đựng những cái tốt của cả Java và JavaScript. Tuy nhiên, nếu bạn chỉ code cho iOS hoặc khá khó chịu với cách tổ chức của Dart nói chung, và của Flutter nói riêng – tất cả đều dùng, và nằm ở constructor nhìn khá dài dòng – thì bạn sẽ ghét luôn Flutter. Mặt khác, cộng đồng Flutter hiện vẫn chưa thể nào mạnh được như React Native, và đa số các trung tâm tin học ở VN có lẽ chưa có nhiều khóa học về Flutter nên bạn sẽ cảm thấy cô đơn khi gặp những vấn đề phức tạp, đặc biệt là các bạn coder phong trào.

Dù vậy, cá nhân tôi vẫn tin tưởng Flutter sẽ cất cánh như cách VueJS đã và đang dần lớn mạnh trong thế gọng kìm của hai ông lớn là React và Angular và các bộ công cụ khác như Ember. Và nếu bạn muốn tìm hiểu thêm về Flutter, hãy đừng ngần ngại vọc vạch. Đến đây, tôi xin kết thúc loạt bài Flutter. Tuy vậy, điều này không có nghĩa là sẽ không còn bài viết nào khác. Trái lại, những bài viết khác về Flutter sẽ còn nhiều hơn và tập trung vào phần chia sẻ kinh nghiệm với dưới dạng bài viết đơn giản. Chúng sẽ xuất hiện ngay tại đây, trên Eitguide.Net.

 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.