Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Flutter Live Activities Plugin

License

NotificationsYou must be signed in to change notification settings

fluttercandies/flutter_live_activities

Repository files navigation

Flutter Live Activities

Flutter plugin for Live Activities. Use to create, update and handling action for [DynamicIsland UI] and [Lock screen/banner UI]

English |中文说明

pub packageGitHub starsGitHub forksFlutterCandies

This plugin requires notification permission

1. Add a Widget to the iOS project

  • Directory structure

2. EditRunner/Info.plist andlive_activity_test/Info.plist

both add:

<plistversion="1.0"><dict>    ...<key>NSSupportsLiveActivities</key><true/>    ...</dict></plist>

3. Create a data channel in widget swift file

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

4. APIs

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()

5. Deeplink

  • The default urlScheme isfla

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');});

6. Display image

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

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors2

  •  
  •  

[8]ページ先頭

©2009-2025 Movatter.jp