簡體   English   中英

Flutter:屏幕關閉時的`setState()`,或者如何檢測屏幕是否打開?

[英]Flutter: `setState()` when screen off, or how to detect if screen is on?

TLDR:如果有以下問題之一的答案,我有一個應該解決的問題:

  1. 有沒有辦法可以檢測屏幕是否打開,例如
if (SCREEN IS ON) {
  setState(() {});  // i.e. update displayed widgets
}
  1. 有沒有辦法調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM