[英]Flutter: `setState()` when screen off, or how to detect if screen is on?
TLDR:如果有以下問題之一的答案,我有一個應該解決的問題:
if (SCREEN IS ON) {
setState(() {}); // i.e. update displayed widgets
}
setState()
以便在屏幕關閉時完成?更多細節:
我有一個播放音頻的應用程序。 當屏幕打開時,小部件通過setState()
更新(例如,顯示音頻的進度)。 盡管如此,讓用戶關閉屏幕以節省電池會很好 - 但是如果我在屏幕關閉時調用setState()
,似乎應用程序在完成setState()
之前等待屏幕重新打開代碼。
因此,我希望確定是否可以檢測到並且僅在屏幕打開時調用setState()
,或者我可以在屏幕關閉時調用setState()
以便完成。
我將它用於 chatApp 來跟蹤應用程序 State。 我包裝了 MaterialApp。 通過一些改變,你可以做你想做的事。
import 'package:flutter/material.dart';
import 'package:flutter_stripe/flutter_stripe.dart';
import 'constants/credentials.dart';
import 'domain/repositories/my_user_repository.dart';
class AppLifeCycleManager extends StatefulWidget {
final Widget child;
final MyUserRepository myUserRepo;
const AppLifeCycleManager(
{Key? key, required this.child, required this.myUserRepo})
: super(key: key);
@override
_AppLifeCycleManagerState createState() => _AppLifeCycleManagerState();
}
class _AppLifeCycleManagerState extends State<AppLifeCycleManager>
with WidgetsBindingObserver {
@override
void initState() {
super.initState();
widget.myUserRepo.setOnlineCustomer();
WidgetsBinding.instance.addObserver(this);
// set the publishable key for Stripe - this is mandatory
Stripe.publishableKey = pkTest;
}
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
super.didChangeAppLifecycleState(state);
switch (state) {
case AppLifecycleState.paused:
widget.myUserRepo.setInactiveCustomer();
break;
case AppLifecycleState.resumed:
widget.myUserRepo.setOnlineCustomer();
break;
case AppLifecycleState.inactive:
widget.myUserRepo.setInactiveCustomer();
break;
case AppLifecycleState.detached:
widget.myUserRepo.setInactiveCustomer();
break;
}
}
@override
Widget build(BuildContext context) {
return widget.child;
}
@override
void dispose() {
widget.myUserRepo.setInactiveCustomer();
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
安裝的可能是您正在尋找的。 或者,您可以使用WidgetsBindingObserver 檢查 AppLifecycleState 。
我沒有對此進行測試,但酒吧中的屏幕 state可能是您正在尋找的。
非常感謝@mario-francois,我得到了以下工作:
import 'package:flutter/material.dart';
class MyPage extends StatefulWidget {
MyPage({Key? key}) : super(key: key);
@override
_MyPageState createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> with WidgetsBindingObserver {
bool screenOn = true;
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
super.didChangeAppLifecycleState(state);
switch (state) {
case AppLifecycleState.paused:// screen off/navigate away
// this.screenOn = false;
break;
case AppLifecycleState.resumed: // screen on/navigate to
this.screenOn = true;
break;
case AppLifecycleState.inactive: // screen off/navigate away
this.screenOn = false;
break;
case AppLifecycleState.detached:
break;
}
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
Widget build(BuildContext context) {
...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.