如何在 Flutter 应用程序的后台运行代码?

Posted

技术标签:

【中文标题】如何在 Flutter 应用程序的后台运行代码?【英文标题】:How to run code in the background of a Flutter app? 【发布时间】:2020-03-19 21:06:00 【问题描述】:

我正在开发一个颤振应用程序。我一天中有很多时间,我想在某个时间到来时显示警报通知,并且如果应用程序正在运行,我还想更改它的 UI。

所以我寻找了我有什么选择,我发现了以下内容

flutter-workmanagerbackground_fetch 等插件 使用 Channels 实现本机代码

我的问题是:

    哪个选项最适合我的用例? 是使用按持续时间延迟的计时器还是使用警报管理器更好。 如何在后台任务和我的应用程序之间传递数据(当前时间),以便更新 UI?

PS:目前我们对至少适用于 android 的解决方案感兴趣。

【问题讨论】:

你需要后台任务做什么?如果您只需要显示通知,则可以在应用运行时将其安排在特定日期时间,而无需使用后台任务。 @IgorKharakhordin 我需要安排任务并显示通知,即使应用程序不工作(例如推送通知但在本地)。如果该应用程序在时间到来时正在运行,我需要使用当前时间更新 UI。 【参考方案1】:

我认为您不需要后台任务来显示通知。使用 flutter_local_notifications 应该足以完成您的任务。您可以使用此插件为特定日期时间安排通知。在应用程序内部,您可以使用Timer 在特定日期时间触发。我给你看一个简单的例子:

class _HomePageState extends State<HomePage> 
  FlutterLocalNotificationsPlugin notifPlugin;

  @override
  void initState() 
    super.initState();
    notifPlugin = FlutterLocalNotificationsPlugin();
  

  Future<void> scheduleNotification(DateTime dateTime, String title) async 
    final now = DateTime.now();
    if (dateTime.isBefore(now)) 
      // dateTime is past
      return;
    

    final difference = dateTime.difference(now);

    Timer(difference, () 
      showDialog(
        context: this.context,
        builder: (context) 
          return AlertDialog(
            content: Text(title),
          );
        
      );
    );

    await notifPlugin.schedule(title.hashCode, title, title, dateTime, platformChannelSpecifics, payload: 'test');
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(),
      body: SafeArea(
        child: Container()
      ),
      floatingActionButton: Builder(
        builder: (context) 
          return FloatingActionButton(
            onPressed: () 
              final snackbar = SnackBar(content: Text('planned notification'), duration: Duration(seconds: 3));
              Scaffold.of(context).showSnackBar(snackbar);
              scheduleNotification(DateTime.now().add(Duration(seconds: 2)), 'Hello');
            ,
          );
        
      ),
    );
  

但如果您需要进行一些计算或数据提取,那么 background_fetch 就是您所需要的。唯一的问题是 Apple 在大多数情况下不允许后台任务。

【讨论】:

感谢您的示例,但我需要的是一个独立于应用程序的任务,即使在应用程序关闭时也负责显示通知。此任务将从服务器(每天)获取时间,然后安排当天的通知(按照您的建议使用 flutter_local_notifications)。 @C.Mahfoud 您是否尝试过使用 background_fetch 或 flutter-workmanager?尝试使用其中任何一种——它们封装了相同的原生 api,所以它们之间没有太大区别。

以上是关于如何在 Flutter 应用程序的后台运行代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中让任务在后台运行

Flutter:在应用程序关闭或在后台运行原生 android 代码

在 Flutter 后台比较和运行代码

如何检测flutter网站是不是在浏览器后台运行?

即使屏幕关闭,如何在后台运行代码?

Flutter:如何在 dart 的后台线程上运行函数