Nhận biết app Flutter ở chế độ background hay foreground

How to detect a Flutter application running in background or foreground?

In some cases you need to check if the app is running in the background or in the live state. If you use regular documents on Stackoverflow or use Flutter’s default API, the results will be incorrect.

Normally you would use the following: inherit the WidgetsBindingObserver class and then override the didChangeAppLifecycleState function. This is only true when you use the official Flutter SDK views. Assuming you call the native API views such as Finger, Face ID, these views will be called at the top, ie inserted on Flutter’s view. When the didChangeAppLifecycleState function is listening, it will misunderstand that the application is entering the background mode but in fact our application is operating normally.
Another disadvantage of didChangeAppLifecycleState is also quite inadequate, if there are 2 or more views on the same screen, only the view called in the last build function can listen to the state. The previously called views did not receive any events.

For more accurate results, we must call the native API (Java, Swift) to check the actual state. I wrote this library for Android and iOS to get more accurate results and overcome the above disadvantages.

Trong một số trường hợp bạn cần phải kiểm tra app đang có chạy vào chế độ nền (background) hay đang ở trạng thái hoạt động trực tiếp (foreground). Nếu bạn sử dụng các tài liệu thông thường trên mạng hoặc sử dụng API mặc định của Flutter thì kết quả sẽ không chính xác.

Thông thường bạn sẽ dùng như sau: kế thừa class WidgetsBindingObserver rồi override lại hàm didChangeAppLifecycleState. Điều này chỉ đúng khi bạn dùng các view của SDK Flutter chính thống. Giả sử đặt trường hợp bạn gọi sang các view của API native như Finger, Face ID thì những view này sẽ được gọi ở trên cùng, tức là chèn lên view của Flutter. Khi hàm didChangeAppLifecycleState đang lắng nghe nó sẽ hiểu nhầm là ứng dụng đang được vào chế độ nền mà thực tế ứng dụng của chúng ta đang thao tác bình thường.
Một nhược điểm nữa của didChangeAppLifecycleState cũng khá bất cập, nếu như có 2 view hoặc nhiều hơn trên cùng một màn hình thì chỉ view được gọi trong hàm build cuối cùng mới có thể lắng nghe trạng thái. Những view được gọi ở trước đó không hề nhận được bất kỳ sự kiện nào.

Để có kết quả chính xác hơn ta phải gọi sang API của native (Java, Swift) để kiểm tra trạng thái thực tế. Tôi đã viết thư viện này dành cho Android và iOS để có kết quả chính xác hơn và khắc phục các nhược điểm trên.

Link thư viện dành cho Flutter: https://pub.dev/packages/flutter_lifecycle_detector

Cách sử dụng: Thêm vào trong initState hàm này sau khi đã cài thư viện:

FlutterLifecycleDetector().onBackgroundChange.listen((isBackground) {

  /// `isBackground` is true => background
  /// `isBackground` is false => foreground
  log('Status background $isBackground');
});

Hi vọng đây sẽ là giải pháp hữu hiệu để chúng ta khắc phục một số lỗi của SDK.