TLDR:如果有以下問題之一的答案,我有一個應該解決的問題:
- 有沒有辦法可以檢測螢屏是否打開,例如
if (SCREEN IS ON) {
setState(() {}); // i.e. update displayed widgets
}
- 有沒有辦法
setState()
在螢屏關閉時呼叫以完成?
更多細節:
我有一個播放音頻的應用程式。當螢屏打開時,小部件通過更新setState()
(例如顯示音頻的進度)。盡管如此,讓用戶關閉螢屏以節省電池會很好 - 但是如果我setState()
在螢屏關閉時呼叫,似乎應用程式在完成setState()
代碼之前等待螢屏重新打開。
因此,我希望確定我是否可以檢測到并且僅setState()
在螢屏打開時呼叫,或者我可以setState()
在螢屏關閉時呼叫以便完成。
uj5u.com熱心網友回復:
我將它用于 chatApp 來跟蹤應用程式狀態。我包裝了 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();
}
}
uj5u.com熱心網友回復:
安裝的可能是您正在尋找的。或者,您可以使用WidgetsBindingObserver檢查AppLifecycleState。
uj5u.com熱心網友回復:
我沒有對此進行測驗,但酒吧中的螢屏狀態可能是您正在尋找的。
uj5u.com熱心網友回復:
非常感謝@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) {
...
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/497906.html
上一篇:Flutter在ListView回傳型別String中顯示嵌套json不是型別轉換中的“Map<String,dynamic>”型別的子型別