如何在 Flutter 应用程序的后台运行代码?
Posted
技术标签:
【中文标题】如何在 Flutter 应用程序的后台运行代码?【英文标题】:How to run code in the background of a Flutter app? 【发布时间】:2020-03-19 21:06:00 【问题描述】:我正在开发一个颤振应用程序。我一天中有很多时间,我想在某个时间到来时显示警报通知,并且如果应用程序正在运行,我还想更改它的 UI。
所以我寻找了我有什么选择,我发现了以下内容
flutter-workmanager 和 background_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 应用程序的后台运行代码?的主要内容,如果未能解决你的问题,请参考以下文章