- Notifications
You must be signed in to change notification settings - Fork3
Flutter Live Activities Plugin
License
fluttercandies/flutter_live_activities
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Flutter plugin for Live Activities. Use to create, update and handling action for [DynamicIsland UI] and [Lock screen/banner UI]
English |中文说明
This plugin requires notification permission
- Directory structure
both add:
<plistversion="1.0"><dict> ...<key>NSSupportsLiveActivities</key><true/> ...</dict></plist>
live_activity_test/live_activity_testLiveActivity.swift
import ActivityKitimport SwiftUIimport WidgetKit// Custom data modelstructTestData{vartext:Stringinit?(JSONData data:[String:String]){self.text=data["text"]??""}init(text:String){self.text= text}}// Data channel <- Must!structFlutterLiveActivities:ActivityAttributes,Identifiable{publictypealiasLiveData=ContentStatepublicstructContentState:Codable,Hashable{vardata:[String:String]}varid=UUID()}@available(iOSApplicationExtension16.1,*)structlive_activity_testLiveActivity:Widget{varbody:someWidgetConfiguration{ // BindingActivityConfiguration(for:FlutterLiveActivities.self){ contextin // Lock screen/banner UI goes here // Json to modelletdata=TestData(JSONData: context.state.data) // UIVStack{Text(data?.text??"")}.activityBackgroundTint(Color.cyan).activitySystemActionForegroundColor(Color.black)} dynamicIsland:{ contextin // Json to modelletdata=TestData(JSONData: context.state.data) // DynamicIslandreturnDynamicIsland{ // Expanded UI goes here. Compose the expanded UI through // various regions, like leading/trailing/center/bottomDynamicIslandExpandedRegion(.leading){Text("Leading")}DynamicIslandExpandedRegion(.trailing){Text("Trailing")}DynamicIslandExpandedRegion(.bottom){ // Show data from flutterText(data?.text??"")}} compactLeading:{Text("L")} compactTrailing:{Text("T")} minimal:{Text("Min")}.keylineTint(Color.red)}}}
For more layout information, please refer to:live activities
import'package:flutter_live_activities/flutter_live_activities.dart';...finalFlutterLiveActivities _liveActivities=FlutterLiveActivities();String? _activityId;
- Check if the Live Activities function is enabled
await _liveActivities.areActivitiesEnabled();
- Get launch url
await _liveActivities.getInitUri()
- Create a Live Activity
_activityId=await _liveActivities.createActivity(<String,String>{'text':'Hello World'});
- Update a Live Activity
if(_activityId!=null) {await _liveActivities.updateActivity(_activityId!,<String,String>{'text':'Update Hello World'});}
The updated dynamic data for both ActivityKit updates and remote push notification updates can’t exceed 4KB in size.doc
For more solutions, please refer tolive_activities
- End a Live Activity
if(_activityId!=null) {await _liveActivities.endActivity(_activityId!);}
- End all Live Activities
await _liveActivities.endAllActivities();
- Get all Live Activities id
await _liveActivities.getAllActivities()
- The default urlScheme is
fla
FlutterLiveActivities({this.urlScheme = 'fla'})
- Add urlScheme in your project
- Swift code:
@available(iOSApplicationExtension16.1,*)structlive_activity_testLiveActivity:Widget{varbody:someWidgetConfiguration{ActivityConfiguration(for:FlutterLiveActivities.self){ contextinletdata=TestData(JSONData: context.state.data) // Lock screen/banner UI goes hereVStack(alignment:.leading){Text(data?.text??"")HStack{ // Create an action via `Link`Link(destination:URL(string:"fla://xx.xx/tap/A")!){Text("A").frame(width:40, height:40).background(.blue)} // Create an action via `Link`Link(destination:URL(string:"fla://xx.xx/tap/B")!){Text("B").frame(width:40, height:40).background(.blue)} // Create an action via `Link`Link(destination:URL(string:"fla://xx.xx/tap/C")!){Text("C").frame(width:40, height:40).background(.blue)}}.frame(width:.infinity, height:.infinity)}.padding(20).activityBackgroundTint(Color.cyan).activitySystemActionForegroundColor(Color.black)} dynamicIsland:{ contextinletdata=TestData(JSONData: context.state.data)returnDynamicIsland{DynamicIslandExpandedRegion(.bottom){ // Create an action via `Link`Link(destination:URL(string:"fla://xxxxxxx.xxxxxx")!){Text(data?.text??"").background(.red)}}} compactLeading:{Text("L")} compactTrailing:{Text("T")} minimal:{Text("Min")}.widgetURL(URL(string:"fla://www.apple.com")) // or use widgetURL.keylineTint(Color.red)}}}
- Dart code:
_subscription??= _liveActivities.uriStream().listen((String? uri) { dev.log('deeplink uri: $uri');});
Due to block size limitations. We can't send metadata to LiveActivities
LiveActivities does not support async loading, so we can't use AsyncImage or read local file
Solution from Developer Forums:716902
- Add group config (Paid account required)
- Add group id both Runner and Widget
- Send image to group:
Dart code:
Future<void>_sendImageToGroup()async {constString url='https://cdn.iconscout.com/icon/free/png-256/flutter-2752187-2285004.png';finalString? path=awaitImageHelper.getFilePathFromUrl(url);if (path!=null) { _liveActivities.sendImageToGroup( id:'test-img', filePath: path, groupId:'group.live_example', ); }}
Swift code:
DynamicIslandExpandedRegion(.leading){iflet imageContainer=FileManager.default.containerURL(forSecurityApplicationGroupIdentifier:"group.live_example")?.appendingPathComponent("test-img"), /// Use id herelet uiImage=UIImage(contentsOfFile: imageContainer.path()){Image(uiImage: uiImage).resizable().frame(width:53, height:53).cornerRadius(13)}else{Text("Leading")}}
About
Flutter Live Activities Plugin
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.