Method Channel trong Flutter

Method Channel trong Flutter

Flutter cho phép 1 base code có thể build được cho nhiều nền tảng. Tuy nhiên, trong lập trình, đôi khi bạn sẽ gặp phải tình huống cần truy cập API dành riêng cho nền tảng bằng ngôn ngữ hoạt động trực tiếp với các API đó (native code). Mình lấy ví dụ một số tình huống như:

  • Lấy lượng pin của device
  • Truy cập camera hoặc thư viện ảnh của device

Đây chính là lúc Method Channel giúp bạn thực hiện điều đó.

Mô hình hoạt động của MethodChannel

MethodChannel hoạt động dựa trên tin nhắn nhị phân (binnary message) và kênh nền tảng (platform channel).

Ở phía client (Flutter UI), MethodChannel cho phép gửi tin nhắn qua các cuộc gọi phương thức. Ở phía platform, MethodChannel trên AndroidFlutterMethodChannel trên iOS nhận các lời gọi method này và trả kết quả về lại. Nên nhớ một điều rằng API sẽ không thực sự “gọi hàm” thay cho bạn. Phần kiểm tra các phương thức được gọi và trả kết quả về sẽ do bạn thực hiện. MethodChannel chỉ “lắng nghe” các lời gọi này mà thôi.

Để đảm bảo cho tương tác của người dùng trên app vẫn mượt mà, các tin nhắn và phản hồi sẽ được gửi 1 cách bất đồng bộ.

Trong bài viết này mình sẽ demo việc lấy lượng pin của thiết bị thông qua MethodChannel.

Đầu tiên chúng ta cần khai báo MethodChannel trong Flutter :

Tiếp tục, chúng ta mở file android/app/src/main/kotlin/MainActivity.kt và thay thế đoạn code này vào sau dòng package.

Nói qua thì, chúng ta cần khai báo tên của channel và tiến hành config cho MethodChannel.

Tiếp tục thêm method để có thể xứ lý việc lấy dung lượng pin của máy.

Tiếp tục tại file main.dart, chúng ta tiến hành gọi đến MethodChannel

Chúng ta dùng invodeMethod để có thể gọi đến MethodChannel, chúng ta truyền tên của phương thức muốn gọi, tên phương thức này trùng với tên phương thức chúng ta đã khai báo trước đó trong file MainActivity.kt.

Cùng xem kết quả sau khi chạy ứng dụng:

0:00
/

Trên đây chúng ta đã cùng tìm hiểu cách dùng MethodChannel, trong bài viết tiếp theo chúng ta sẽ cùng tìm hiểu về EventChannel trong Flutter.