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?