Lập trình rất khó. Mặc dù không quá khó để chạy ứng dụng Counter, nhưng để trở thành chuyên gia về một framework như Flutter và một ngôn ngữ như Dart thì cần nhiều thời gian hơn, có thể mất nhiều năm. Vì vậy, trong bài viết này, tôi sẽ đưa ra một số lời khuyên để giúp bạn nâng cao trình độ.

Lưu ý: Bài viết này chủ yếu hướng tới các lập trình viên Flutter trình độ đã biết cơ bản rồi

1. State management

Đầu tiên tôi muốn nói đến State Management vì đây là điều bạn quan tâm khi mới bắt đầu phát triển Flutter. Với việc phát triển Android và iOS, bạn tuân theo các pattern được khuyến nghị, nhưng với Flutter, bạn có quá nhiều lựa chọn đến nỗi phân vân không biết nên lựa chọn cái nào cho phù hợp.

Để hiểu rõ State Management, bạn nên thoải mái sử dụng một số giải pháp quản lý state khác nhau. Bạn không nhất thiết phải học tất cả cùng một lúc mà hãy đặt ba hoặc bốn mục tiêu. Khi làm như vậy, bạn sẽ bắt đầu nhận ra các pattern tương đồng với nhau giữa chúng.

Lời khuyên của tôi cho người mới bắt đầu là tạo một vài ứng dụng bằng cách sử dụng các stateful widget và gọi setState bất cứ khi nào bạn muốn cập nhật UI. Điều này không yêu cầu bất kỳ state management package đặc biệt nào của bên thứ ba và bạn có thể kết hợp hầu hết mọi thứ với nó. Điều này sẽ giúp bạn có những hiểu biết cơ bản về cách reactive UI hoạt động.

Đối với ứng dụng đầu tiên của bạn, tôi khuyên bạn nên chọn một giải pháp quản lý state dễ hiểu như GetX hay the minimalist approach. Bạn có thể thực sự thích lựa chọn của mình và tiếp tục tạo ra những app khác bằng phương pháp đã chọn.

Tuy nhiên, để thực sự giỏi state management, bạn nên tìm hiểu một số phương pháp khác. Trên những app tiếp theo, hãy thử một số cái mới. Tìm hiểu về Provider và cũng có thể là RiverPod, và để biết Provider hoạt động như thế nào, hãy tìm hiểu InheritedWidget. Nhiều nhóm phát triển chuyên nghiệp sử dụng BloC Library , vì vậy nó nên có trong danh sách của bạn. Bạn cũng có thể xem xét cả Redux và MobX.

Tôi không nói rằng bạn cần biết tất cả chúng để có thể thành công. Trên thực tế, việc tập trung, chuyên môn hóa một giải pháp quản lý state cũng mang đến một số lợi ích . Tuy nhiên, tôi đang nói trong trường hợp bạn muốn phát triển kỹ năng và trở thành một chuyên gia về Flutter, bạn nên biết nhiều hơn một hoặc hai cách để xử lý State.

Câu hỏi có thể tự đặt ra cho bản thân

  • Bạn có biết tầm quan trọng của mutable state và immutable state không?
  • Bạn có thể triển khai một ứng dụng có chức năng hoàn tác (undo) không?
  • Bạn có hiểu tầm nhìn tổng thể về cách thức vận hành của tất cả các giải pháp quản lý state không?

2. App architecture (Kiến trúc ứng dụng)

Tôi tách điều này ra khỏi state management vì hầu hết mọi người xem state management chỉ là lớp quản lý UI. Tuy nhiên, có thể có nhiều thứ hơn thế đối với ứng dụng của bạn. Ví dụ, bạn xử lý như thế nào với I/O như network calls và data storage (lưu trữ dữ liệu)? Bạn nên đặt business logic của mình ở đâu cho hợp lý? Các entity và use cases sử dụng như thế nào?

Những cách để bạn phát triển trong lĩnh vực này không nói riêng Flutter hay Dart. Có rất nhiều nguồn tài liệu được xuất bản trong nhiều năm và không giống như mọi thứ khác trong ngành công nghiệp máy tính, hầu hết chúng không bị lỗi thời.

Câu hỏi có thể tự đặt ra cho bản thân

  • Bạn đã từng phiền lòng vì kiến trúc ứng dụng của mình viết khá tệ (bad architecture) chưa? Nếu chưa thì có lẽ bạn chưa sẵn sàng cho phần này.
  • Bạn có hiểu sự khác biệt giữa dependency injection và service locators?
  • Bạn có thể áp dụng các nguyên tắc kiến trúc (architectural principles) cho một ứng dụng Flutter không?
  • Sẽ ảnh hưởng như nào đến code base ứng dụng của bạn nếu chuyển từ sử dụng Shared Preferences sang SQL? Hoặc từ Firebase sang AWS?
  • Nó sẽ ảnh hưởng như nào đến code base của ứng dụng nếu giải pháp quản lý state yêu thích của bạn không còn được dùng nữa?
  • Bạn tổ chức dự án của mình theo lớp hay theo tính năng? Bạn có hiểu ý nghĩa của cả hai?

3. Testing

Writing tests là một trong những cách phân biệt các lập trình viên bình thường với những lập trình viên giỏi. Một số người bỏ qua các bài tests vì chúng lãng phí thời gian. Một số không viết tests vì họ không biết cách kiểm tra các tính năng cụ thể.

Các bài tests sẽ không quan trọng nếu các bạn đang cùng nhau hack một dự án nhanh chóng, nhưng nếu bạn có kế hoạch duy trì nó theo thời gian, chúng sẽ giúp bạn tránh bị lỗi trong những lần build tiếp theo. Ngoài ra, việc kiểm tra thuận lợi (test coverage) giúp bạn tự tin thay đổi codebase của mình.

Tôi khuyên bạn nên bắt đầu với các unit test. Chúng rất dễ viết và dễ hiểu. Và nếu state management và kiến trúc của bạn được set up tốt, bạn có thể bao phủ khá nhiều code của mình bằng các unit test. Sau đó, hãy tìm hiểu về các widget test, integration test, và golden test. Những điều này có phần khó khăn nhưng nếu bạn cố gắng, bạn sẽ học được.

Khi lần đầu test, bạn thỉnh thoảng chạy các bài test theo cách thủ công, nhưng những người thiết lập hệ thống nơi họ tự động chạy các bài test mỗi khi có thay đổi được cam kết với repository. Điều này được gọi là Continuous Integration (CI). Một bước nữa là Continuous Delivery/Deployment (CD), nơi publish phiên bản cập nhật của ứng dụng lên phiên bản sản xuất cũng được tự động hóa. Hãy học cách tự động hóa các công việc lặp đi lặp lại khi là lập trình viên. Tuy nhiên, nếu việc testing thủ công và cam kết với repository không phải task đơn giản đối với bạn, thì có thể bạn chưa sẵn sàng cho CI / CD. Trước tiên hãy làm việc trên git và testing skills.

Câu hỏi có thể tự đặt ra cho bản thân

  • Bạn đã bao giờ publish một bản cập nhật cho ứng dụng và sau đó phát hiện bạn đã làm lỗi nó hay chưa? Nếu chưa, có thể bạn vẫn chưa sẵn sàng cho phần này.
  • Bạn có biết khi nào và làm thế nào để sử dụng các widget test, integration test, và golden test không?
  • Tần suất bạn chạy các bài test của mình thường xuyên hay không? Bạn commit code của mình với GitHub hoặc một repository khác bao lâu một lần?
  • Bạn đã publish bản cập nhật ứng dụng bao nhiêu lần? Một lần bạn mất bao nhiêu thời gian?

4. UI design

Flutter giúp bạn dễ dàng (có thể không phải lúc nào cũng dễ dàng, nhưng khả năng cao) xây dựng bất kỳ layout nào mà bạn mong muốn. Tuy nhiên, có thể tạo layout đẹp không có nghĩa là bạn luôn có những layout đẹp. Rất có thể bạn nhận được thứ gì đó giống ứng dụng Counter. Không phải ứng dụng Counter xấu, nhưng…đó là Counter app.

Counter app

Tôi khuyên bạn nên sử dụng Flutter để clone những thiết kế đẹp cho những người muốn cải thiện kỹ năng thiết kế UI của mình. Bạn có thể tìm thấy các ví dụ của riêng mình và đây là một số ví dụ từ một bài viết trên designhack.net:

Ảnh màn hình từ designshack.net
Bạn có thể triển khai thiết kế đó trong Flutter không? Bạn sẽ học được nhiều điều nếu bạn cố gắng.

Việc tìm kiếm thiết kế tốt hơn sẽ giúp bạn có cơ hội tìm hiểu về cách tạo các widget tùy chỉnh, icon, typography (kiểu chữ), và animation. Các widget và animation tùy chỉnh đều có nhiều kiến thức chuyên sâu để bạn có thể tha hồ thoả sức nghiên cứu. Với các widget tùy chỉnh, bạn muốn bắt đầu với layout đơn giản, nhưng bạn cần tìm hiểu về các render object tùy chỉnh bằng tay khi các thứ có sẵn không giúp bạn nhiều nữa. Đối với animation, bạn có thể bắt đầu với các animated widget khác nhau mà Flutter cung cấp, nhưng cũng sẽ rất tốt nếu bạn học cách tạo animation tùy chỉnh theo ý riêng của mình. Và để nâng nó lên một cấp độ hoàn toàn mới, hãy học cách tạo animation Rive.

Ví dụ về hoạt ảnh Rive

Câu hỏi có thể tự đặt ra cho bản thân

  • Có thiết kế UI nào mà bạn đã lựa chọn trong quá khứ nhưng chưa có thời gian để làm không?
  • Bạn có sử dụng animation trong ứng dụng của mình không?
  • Bạn đã học Rive chưa?
  • Thiết kế ứng dụng của bạn trông như thế nào trên Android, iOS, Windows, Mac, Linux và web? Đối với light hoặc dark theme thì sao?

5. Flutter internals

Bạn có biết Flutter và Dart hoạt động như thế nào không? Hiểu được điều đó sẽ giúp bạn trở thành một lập trình viên tốt hơn. Cách tốt nhất để học là đọc source code. Bắt đầu với widget yêu thích của bạn và đọc tất cả các nhận xét (comment) trong source code. Sau đó, theo liên kết đến file source khác và tiếp tục đọc. Bạn càng làm điều này, bạn sẽ càng quen thuộc với cách Flutter hoạt động.

Tuy nhiên, bạn có thể làm một số điều khác ngoài việc đọc. Flutter và Dart là các dự án open-source. Bạn cũng có thể đóng góp. Bắt đầu từ những việc nhỏ, như sửa lỗi đánh máy trong tài liệu hoặc giải thích rõ ràng hơn. Tham gia vào các cuộc thảo luận về vấn đề nào đó trên GitHub. Sau đó, từ từ làm để tạo ra những đóng góp đáng kể hơn.

Câu hỏi có thể tự đặt ra cho bản thân

  • Bạn có thể giải thích sự tương tác giữa các widget, element và các render object không?
  • Event loop (vòng lặp sự kiện) hoạt động như thế nào trong Dart?
  • Khi một app Flutter khởi động lần đầu, điều gì sẽ xảy ra trước khi bạn nhìn thấy bất kỳ thứ gì được vẽ trên màn hình?
  • Bạn đã đóng góp gì cho open source nói chung và Flutter/Dart nói riêng?

6. Dart cho backend

Hầu hết mọi người sử dụng Dart để viết các ứng dụng Flutter, nhưng nó hoạt động rất tốt cho các command line và server app. Hãy tưởng tượng sẽ tuyệt vời như thế nào nếu sử dụng một ngôn ngữ cho cả công việc frontend và backend.

Bạn có thể xây dựng một server chỉ với những công cụ cơ bản mà Dart cung cấp. Ngoài ra, shelf package sẽ giúp thực hiện rất nhiều task thông thường. Mặc dù nhiều server framework Dart HTTP lớn hơn đã bị loại bỏ nhưng một số framework mới đang được phát triển. Việc đóng góp vào chúng sẽ là một cơ hội học tập tuyệt vời.

Một điều nữa là Dart Functions Framework chạy Dart trên cloud. Điều này có nghĩa là đơn giản hóa các task mà tôi đã nói trong đoạn trước, vì vậy nếu bạn muốn giỏi Dart thì không nên bỏ qua những thứ cấp thấp. Và cũng rất hữu ích nếu bạn hiểu được sức mạnh của các tùy chọn cấp cao.

Câu hỏi có thể tự đặt ra cho bản thân

Bạn có thể xây dựng Dart server cho ứng dụng Flutter của mình không?
Bạn có biết cách thiết lập routing, database access và xác thực thông tin người dùng?

7. Chủ đề nâng cao

Sẽ luôn có một vài chủ đề mà bạn không biết hoặc biết nhưng chưa bao giờ đụng tới. Tuy nhiên, bạn có thể cân nhắc và liệt kê vài chủ đề mà bạn muốn học.

Đây là vài ví dụ:

Dart FFI.
Binary data manipulation.
Streams.
Sockets.
Platform channels.
Packages.
Federated plugins.
Navigation and deep linking.
Câu hỏi có thể tự đặt ra cho bản thân
Chủ đề bạn tò mò mà chưa biết là gì?
Bạn chưa rõ hoặc không biết bao nhiêu mục trong list trên?

Kết:

Nếu ngay từ đầu bạn không nghĩ sẽ mất nhiều năm thì có lẽ bây giờ bạn đã bị thuyết phục

Qua bài viết này bạn có thể thấy để thực sự giỏi Flutter và Dart bạn sẽ mất nhiều năm. Tuy nhiên, nếu bạn có đủ động lực và dành đủ thời gian, bạn có thể đạt được điều đó sớm. Đó cũng là những gì tôi nói với bản thân mình. Đến khi thực sự giỏi Flutter và Dart, tôi sẽ cho bạn biết mình đã mất bao lâu. Tuy nhiên, tôi đã giỏi hơn trước đây rất nhiều. Và tôi nghĩ đó là sự tiến bộ rất lớn.


Các bạn có thể bắt đầu với Lập trình Flutter, làm quen với Dart từ khóa học Lập trình Di động đa nền tảng Fflutter tại Techmaster mà tôi đã học nhé.