Flutter:如何在没有小部件的情况下跟踪应用程序生命周期

Posted

技术标签:

【中文标题】Flutter:如何在没有小部件的情况下跟踪应用程序生命周期【英文标题】:Flutter: How to track app lifecycle without a widget 【发布时间】:2020-04-27 00:35:56 【问题描述】:

我参与了 FlutterSound 项目,该项目作为一个包提供,其中包含一个 api,就本问题而言,它不包含小部件。

API 需要在应用程序更改其状态时处理事件(AppLifecycleState.pause/resume)。 (我们需要在应用暂停/恢复时停止/恢复音频)。

我可以看到如何使用 WidgetsBindingObserver 在小部件中执行此操作,但 api 需要相同的信息,而不必依赖小部件。

SchedulerBinding 类有一个方法 handleAppLifecycleStateChanged,它似乎提供了所需的信息,但不清楚如何在小部件之外实现这一点。

【问题讨论】:

我相信无论如何你必须至少有一个小部件才能启动你的应用程序。您认为您可以为此目的使用该小部件吗? (我也遇到了类似的问题,想知道是否有直接的方法来检索应用程序生命周期状态;例如:getAppLifecycleState()。似乎找不到类似的东西。如果没有这样的东西,我会有利用我的应用程序的根小部件) 我正在构建一个可用作 API 的库。我不想强迫该库的用户必须使用我强加给他们的小部件。 感谢您的澄清。我为我的项目想出了一个解决方案;请在下面查看我的答案 【参考方案1】:

下面是一个可以监听AppLifecycleState更改事件而不直接涉及小部件的代码示例:

import 'package:flutter/material.dart';

class MyLibrary with WidgetsBindingObserver 
  AppLifecycleState _state;

  AppLifecycleState get state => _state;

  MyLibrary() 
    WidgetsBinding.instance.addObserver(this);
  

  /// make sure the clients of this library invoke the dispose method
  /// so that the observer can be unregistered
  void dispose() 
    WidgetsBinding.instance.removeObserver(this);
  

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) 
    this._state = state;
  

  void someFunctionality() 
    // your library feature
  

现在您可以在 Flutter 小部件中实例化该库,例如,它将开始侦听 AppLifecycleState 中的任何更改。

请注意,上面的代码没有处理冗余绑定。例如,如果您的库的客户端打算在不同的地方多次初始化库,则每次状态更改都会触发 didChangeAppLifecycleState() 方法多次(取决于创建的库实例的数量)。另外我不确定提出的解决方案是否符合颤振最佳实践。不过它解决了问题,希望对您有所帮助!

【讨论】:

这看起来很有希望。我刚刚实现了它。明天测试并更新。 很高兴知道。干杯!

以上是关于Flutter:如何在没有小部件的情况下跟踪应用程序生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何防止我的主要小部件旋转并仍然跟踪它的方向?

在没有 ListView 等的情况下刷新 Flutter 中的小部件或页面

Flutter,是不是可以在没有小部件构建方法的情况下在功能中使用 Firestore Stream Builder?

App Store Connect 是不是会跟踪小部件在 iOS 14 上的安装情况?

Flutter - 动态小部件定位

Flutter - 小部件的状态没有改变