Tìm hiểu Dagger 2 trong Android – Bắt đầu từ cơ bản

Chúng tôi rất vui mừng được chia sẻ kiến thức sâu sắc về từ khóa Dagger la gi và hi vọng rằng nó sẽ hữu ích cho các bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và chọn lọc từ khóa phù hợp, kèm theo các chiến lược và công cụ hữu ích. Hi vọng rằng thông tin chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật kiến thức mới nhất.

Trong nội dung bài viết về kiến trúc MVP trong Android, tôi đã từng giới thiệu thư viện Dragger2, một thư viện Dependency Injection mạnh mẽ và hữu ích giành riêng cho phát triển Android. Nội dung bài viết này mình sẽ san sớt cách sử dụng Dagger 2 trong Android, rất rất cơ bản để các bạn mới cũng luôn có thể hiểu và vận dụng được.

Bạn Đang Xem: Tìm hiểu Dagger 2 trong Android – Bắt đầu từ cơ bản

Trước đó khi mình mới học lập trình, tôi cũng mở màn tìm hiểu về quy tắc viết clean code SOLID. Thực sự nó làm mình tẩu hỏa nhập ma với hàng loạt khái niệm như: Dependency Injection, Provider, Component, Module, Scope

Do vậy, tôi đã tự hứa với bản thân rằng khi nào tôi đã làm rõ về quy tắc này thì tức tốc phải làm ngay một nội dung bài viết để san sớt lại cho mọi người (cũng vừa giúp mình ghi nhớ lại).

Và đây là một phần trong kế hoạch đó, một nội dung bài viết về Dagger 2, một thư viện tương trợ bạn thực hiện nguyên tắc Dependency Injection( một phần trong triết lý SOLID).

Tìm hiểu dagger Dagger 2 trong Android cho người mới
Tìm hiểu dagger Dagger 2 trong Android

Tìm hiểu Dagger 2 trong Android

#Khởi tạo dự án Android

Trước khi chúng ta mở màn đọc nội dung bài viết này, bạn đã nghe biết các khái niệm như Function, Class và Member Variables rồi đúng không nào?

Và bạn cũng biết phương pháp tạo một dự án trong Android Studio rồi chứ? Thậm chí là Android Studio thời điểm hiện nay còn tương trợ tạo dự án với những tính năng cơ bản mà bạn không nhất thiết phải nhúng tay code.

Tuy nhiên, để tiện theo dõi, tất cả chúng ta sẽ tạo một dự án với một Empty Activity. Sau đó thêm một TextView.

Và đây là code của MainActivity:

class MainActivity : AppCompatActivity() { val info = Info() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) text_view.text = info.text } } class Info { val text = “Hello Dagger 2” }

#Chuyển Class Info thoát ra khỏi Activity…

Trong các dự án thực tế, mình không chỉ có mỗi một biến info như vậy kia. Ngoài ra, thông tin Info mình còn muốn san sớt giữa các Activity với nhau nữa.

Nếu tất cả chúng ta khởi tạo Info trong MainActivity sẽ làm cho code không được clean. Việc thừa kế code sẽ trở thành khó khăn hơn.

Do đó, thay vì tất cả chúng ta tạo một class Info trong MainActivity. Mình muốn thông tin ( và các trở thành viên khác nữa) được tạo ở một nơi khác.

Bạn có biết hành động này gọi là gì không? Đó đó chính là Dependencies Injection.

Hướng dẫn sử dụng Dagger 2 trong Android cho người mới

Lúc này code của tất cả chúng ta thay vì khỏi tạo và khái niệm Info bên trong MainActivity. Tất cả chúng ta sẽ truyền Info vào.

class MainActivity(val info:Info) : AppCompatActivity()

Ồ! Có gì đó sai sai trong đoạn code trên. Dường như Android không được chấp nhận truyền thông số vào MainActivity. Vậy phải làm thế nào đây?

Nếu khách hàng có kinh nghiệm lập trình Android thì các bạn sẽ nghĩ đến class Application. Tất cả chúng ta sẽ truyền thông số cho MainActivity từ class Application. Tuy nhiên, ở đây tất cả chúng ta không làm thế, tất cả chúng ta sẽ sử dụng Dagger2.

🔥 Rất có ích cho bạn: Quy tắc viết Code Clean trong Android

#Ứng dụng của Dagger 2 trong Android

Với Dagger2, giờ đây tất cả chúng ta có thể làm cho Info xuất hiện một cách kì diệu.

Trước tiên, tất cả chúng ta sẽ loại bỏ được đoạn code khai báo khởi tạo class Info: val info = Info();

Ngoài Dagger 2 có thể làm được điều này, thì chỉ có David Copperfield mới làm được 🙂

Xem Thêm : “Thực tập sinh” trong tiếng Anh: Định nghĩa, ví dụ

Thực ra, tất cả chúng ta vẫn phải truyền Info vào MainActivity nhưng không phải thông qua việc dùng hàm khởi tạo như trên.

Tạm thời, code sẽ như sau:

lateinit var info: Info override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) text_view.text = info.text } } class Info { val text = “Hello Dagger 2” }

Từ khóa lateinit là khởi tạo sau. Tất cả chúng ta không muốn info là NULL, nó phải được khởi tạo và có mức giá trị.

Lưu ý: Đoạn code trên vẫn chưa chạy được. Nếu khách hàng thử chạy sẽ gặp lỗi CRASH vì đối tượng người sử dụng Info không được khởi tạo mà bạn lại gọi info.text

Đừng lo lắng, tất cả chúng ta sẽ thực sự mở màn với Dagger 2, xem nó khởi tạo Info như nào nhé!

#Thêm thư viện Dagger 2 trong Android Studio

Cũng giống như bất kì thư viện nào khác, bạn khai báo dagger 2 trong mục dependencies như sau:

dependencies { implementation fileTree(dir: ‘libs’, include: [‘*.jar’]) // … other dependencies … implementation ‘com.google.dagger:dagger:2.13’ kapt ‘com.google.dagger:dagger-compiler:2.13’ }

apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ apply plugin: ‘kotlin-android-extensions’ apply plugin: ‘kotlin-kapt’

Sau đó nhớ Sync lại dự án.

#Giới thiệu đôi chút về @ Component

Theo khái niệm chính thức thì @component là 1 trong những interface dùng để làm làm cầu nối giữa module và injection.

Trong nội dung bài viết này, mình muốn tạo một component mà được chấp nhận mình tạo các biến info thành viên.

@Component interface MagicBox { fun poke(app: MainActivity) }

Để mình giảng giải cho rõ ràng hơn chút. Chúng ta cũng có thể tưởng tượng rằng MagicBox sẽ tiến hành sử dụng để poke MainActivity như hình minh họa phía dưới và cung cấp Info cho MainActivity.

Hướng dẫn sử dụng Dagger 2 trong Android cho người mới

Việc của tất cả chúng ta là đưa Info vào MagicBox, sót lại hãy để Dagger2 lo.

Mình tin rằng sẽ có được nhiều bạn thắc mắc: Vì sao cứ cố tạo MagicBox với Dagger2 chi cho mệt, thay vì tạo luôn Info trực tiếp trong MainActivity như ban sơ ấy, có sao đâu?

Giả sử, tất cả chúng ta có rất nhiều member variable khác (ngoài biến info ra). Và nhiều Class hay Activity khác cũng cần được đến chúng. Thế lúc đó các class đó cũng sẽ phải tự tạo các member variables tương tự của riêng mình.

Duplicate code là đây chứ đâu!

Tìm hiểu Dagger 2 trong Android cho người mới

Bạn đã hiểu vai trò của MagicBox chưa!?

🔥 Đọc thêm: share mã nguồn Flashlight 3D Android giá 69$

#Đưa Info vào @Component…Giới thiệu @Inject

Xem Thêm : 910 là gì? Mật mã tình yêu của giới trẻ hiện nay – Hỏi Gì 247

Okay, giờ tất cả chúng ta sẽ đưa Info vào @Component…

Mình đoán là một số các bạn sẽ nghĩ nếu tất cả chúng ta tự đưa Info vào @Component thì @Component có gì đặc biệt quan trọng đâu. Tất cả chúng ta cũng luôn có thể tạo một class thông thường để làm điều này mà.

Thực tế thì tất cả chúng ta không nhất thiết phải truyền Info vào MagicBox. Tất cả chúng ta chỉ có thêm một annotation vào ngay trước class Info. Sau đó Dagger 2 sẽ tự răn phải làm gì.

Và annotation đó đó chính là @Inject.

class Info @Inject constructor() { val text = “Hello Dagger 2” }

Chúng ta cũng có thể thêm @Inject vào bất kỳ class/Object nào bạn muốn. Dagger2 sẽ kết nối class đó tới MagicBox.

#Xây dựng MagicBox

Có một điều nhất là MagicBox được khai báo là một Interface. Về nguyên tắc, để sử dụng Interface, tất cả chúng ta cần phải implement nó.

Tuy nhiên, ai sẽ implement Interface? MainActivity chăng?

Không phải. Với Dagger2 trong Android, khi chúng ta đã khai báo MagicBox với annotation @Component, bạn chỉ có gọi hàm trong MagicBox thông qua static class với tên là: DaggerMagicBox.

Kiểu như sau:

DaggerMagicBox.create().poke()

Tuy nhiên, Khóa học vẫn CRASH!!!

Bởi vì dagger 2 trong android không được tạo bất kì trở thành viên (member variables) nào khi không được phép.

Vì vây, để thông tin cho Dagger 2 biết biến nào được phép tạo bằng phương pháp thêm annotation @Inject vào trước biến đó là được.

@Inject lateinit var info: Info

Code hoàn chỉnh sẽ như sau:

class MainActivity : AppCompatActivity() { @Inject lateinit var info: Info override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) DaggerMagicBox.create().poke(this) text_view.text = info.text } } class Info @Inject constructor() { val text = “Hello Dagger 2” } @Component interface MagicBox { fun poke(app: MainActivity) }

Nói thì dông dài nhưng code thì có tý tẹo thôi ah.

#Tạm kết

Như vậy tôi đã hướng dẫn các bạn tìm hiểu Dagger cùng với cách Dependency Injection với Dagger2 trong Android.

Các chúng ta cũng có thể tải về toàn bộ code của nội dung bài viết tại đây:

Nếu nội dung bài viết có ở đâu khó hiểu thì để lại phản hồi để mọi người cùng tương trợ nhé!

Cảm ơn bạn đã theo dõi!

Đọc thêm:

  • Năm 2020 rồi, lập trình viên Android cần học những gì?
  • Toàn tập về AlarmManager trong Android
  • Sử dụng Data Binding trong Android hiệu quả

Nguồn: Medium

You May Also Like

About the Author: v1000