Flutter Package for Easier Creation of Home Screen Widgets

Overview

Home Widget

Pub likes popularity pub points Build

HomeWidget is a Plugin to make it easier to create HomeScreen Widgets on Android and iOS. HomeWidget does not allow writing Widgets with Flutter itself. It still requires writing the Widgets with native code. However, it provides a unified Interface for sending data, retrieving data and updating the Widgets

iOS  Android

Platform Setup

In order to work correctly there needs to be some platform specific setup. Check below on how to add support for Android and iOS

Android

Create Widget Layout inside android/app/res/layout

Create Widget Configuration into android/app/res/xml

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/example_layout"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen">
</appwidget-provider>

Add WidgetReceiver to AndroidManifest

<receiver android:name="HomeWidgetExampleProvider" >
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
        android:resource="@xml/home_widget_example" />
</receiver>

Write your WidgetProvider

For convenience, you can extend from HomeWidgetProvider which gives you access to a SharedPreferences Object with the Data in the onUpdate method. In case you don't want to use the convenience Method you can access the Data using

import es.antonborri.home_widget.HomeWidgetPlugin
...
HomeWidgetPlugin.getData(context)

which will give you access to the same SharedPreferences

More Information

For more Information on how to create and configure Android Widgets checkout (https://developer.android.com/guide/topics/appwidgets)[this guide] on the Android Developers Page.

iOS

Add a Widget to your App in Xcode

Add a widget extension by going File > Target > Widget Extension

Widget Extension

Add GroupId

You need to add a groupId to the App and the Widget Extension

Note: in order to add groupIds you need a paid Apple Developer Account

Go to your Apple Developer Account and add a new group Add this group to you Runner and the Widget Extension inside XCode Signing & Capabilities > App Groups > +

Build Targets

(To swap between your App, and the Extension change the Target)

Sync CFBundleVersion (optional)

This step is optional, this will sync the widget extension build version with your app version, so you don't get warnings of mismatch version from App Store Connect when uploading your app.

Build Phases

In your Runner (app) target go to Build Phases > + > New Run Script Phase and add the following script:

generatedPath="$SRCROOT/Flutter/Generated.xcconfig"
versionNumber=$(grep FLUTTER_BUILD_NAME $generatedPath | cut -d '=' -f2)
buildNumber=$(grep FLUTTER_BUILD_NUMBER $generatedPath | cut -d '=' -f2)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$SRCROOT/HomeExampleWidget/Info.plist"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $versionNumber" "$SRCROOT/HomeExampleWidget/Info.plist"

Replace HomeExampleWidget with the name of the widget extension folder that you have created.

Write your Widget

Check the Example App for an Implementation of a Widget A more detailed overview on how to write Widgets for iOS 14 can fbe found on the Apple Developer documentation. In order to access the Data send with Flutter can be access with

let data = UserDefaults.init(suiteName:"YOUR_GROUP_ID")

Usage

Setup

For iOS, you need to call HomeWidget.setAppGroupId('YOUR_GROUP_ID'); Without this you won't be able to share data between your App and the Widget and calls to saveWidgetData and getWidgetData will return an error

Save Data

In order to save Data call HomeWidget.saveWidgetData<String>('id', data)

Update a Widget

In order to force a reload of the HomeScreenWidget you need to call

HomeWidget.updateWidget(
    name: 'HomeWidgetExampleProvider',
    androidName: 'HomeWidgetExampleProvider',
    iOSName: 'HomeWidgetExample',
);

The name for Android will be chosen by checking androidName if that was not provided it will fallback to name. This Name needs to be equal to the Classname of the WidgetProvider

The name for iOS will be chosen by checking iOSName if that was not provided it will fallback to name. This name needs to be equal to the Kind specified in you Widget

Retrieve Data

To retrieve the current Data saved in the Widget call HomeWidget.getWidgetData<String>('id', defaultValue: data)

Background Update

As the methods of HomeWidget are static it is possible to use HomeWidget in the background to update the Widget even when the App is in the background.

The example App is using the flutter_workmanager plugin to achieve this. Please follow the Setup Instructions for flutter_workmanager (or your preferred background code execution plugin). Most notably make sure that Plugins get registered in iOS in order to be able to communicate with the HomeWidget Plugin. In case of flutter_workmanager this achieved by adding:

WorkmanagerPlugin.setPluginRegistrantCallback { registry in
    GeneratedPluginRegistrant.register(with: registry)
}

to AppDelegate.swift

Clicking

To detect if the App has been initially started by clicking the Widget you can call HomeWidget.initiallyLaunchedFromHomeWidget() if the App was already running in the Background you can receive these Events by listening to HomeWidget.widgetClicked. Both methods will provide Uris, so you can easily send back data from the Widget to the App to for example navigate to a content page.

In order for these methods to work you need to follow these steps:

iOS

Add .widgetUrl to your WidgetComponent

Text(entry.message)
    .font(.body)
    .widgetURL(URL(string: "homeWidgetExample://message?message=\(entry.message)&homeWidget"))

In order to only detect Widget Links you need to add the queryParameterhomeWidget to the URL

Android

Add an IntentFilter to the Activity Section in your AndroidManifest

<intent-filter>
    <action android:name="es.antonborri.home_widget.action.LAUNCH" />
</intent-filter>

In your WidgetProvider add a PendingIntent to your View using HomeWidgetLaunchIntent.getActivity

val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity(
        context,
        MainActivity::class.java,
        Uri.parse("homeWidgetExample://message?message=$message"))
setOnClickPendingIntent(R.id.widget_message, pendingIntentWithData)

Background Click

Android allows interactive elements in HomeScreenWidgets. This allows to for example add a refresh button on a widget. With home_widget you can use this by following these steps:

Android/Native Part

  1. Add the necessary Receiver and Service to you AndroidManifest.xml file
    <receiver android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver">
        <intent-filter>
            <action android:name="es.antonborri.home_widget.action.BACKGROUND" />
        </intent-filter>
    </receiver>
    <service android:name="es.antonborri.home_widget.HomeWidgetBackgroundService"
        android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>
    
  2. Add a HomeWidgetBackgroundIntent.getBroadcast PendingIntent to the View you want to add a click listener to
    val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(
        context,
        Uri.parse("homeWidgetExample://titleClicked")
    )
    setOnClickPendingIntent(R.id.widget_title, backgroundIntent)

Dart

  1. Write a static function that takes a Uri as an argument. This will get called when a user clicks on the View
    void backgroundCallback(Uri data) {
      // do something with data
      ...
    }
  2. Register the callback function by calling
    HomeWidget.registerBackgroundCallback(backgroundCallback);
Comments
  • Can reload home widget for platform Android, while platform iOs is not

    Can reload home widget for platform Android, while platform iOs is not

    Hello bro,

    I can reload home widget for platform Android, while platform iOs is not.

    I can replace content "..." by other content in platform Android, while can not in platform iOs. Screen Shot 2020-11-19 at 16 48 22

    Please tell me what I need to do more.

    Code sample :

    I used this in main widget as guide told me.

    @override
      void initState() {
        super.initState();
        // HOME_SCREEN_WIDGET_ID : nct_home_widget
        HomeWidget.setAppGroupId(Constants.HOME_SCREEN_WIDGET_ID); 
      }
    

    I'm using these code for update data (it works for platform Android) Screen Shot 2020-11-19 at 16 12 48 Screen Shot 2020-11-19 at 16 12 41

    iOs files structure: (HomeWidgetExample created as Widget Extension in Xcode) Screen Shot 2020-11-19 at 16 47 15

    *.entitlements Screen Shot 2020-11-19 at 16 14 15

    HomeWidgetExample.swift

    //
    //  widget.swift
    //  widget
    
    import WidgetKit
    import SwiftUI
    import Intents
    
    private let widgetGroupId = "nct_home_widget"
    
    struct Provider: TimelineProvider {
        func placeholder(in context: Context) -> ExampleEntry {
            ExampleEntry(date: Date(), title: "Placeholder Title", message: "Placeholder Message")
        }
    
        func getSnapshot(in context: Context, completion: @escaping (ExampleEntry) -> ()) {
            let data = UserDefaults.init(suiteName:widgetGroupId)
            let entry = ExampleEntry(date: Date(), title: data?.string(forKey: "title") ?? "No Title Set", message: data?.string(forKey: "message") ?? "No Message Set")
            completion(entry)
        }
    
        func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
            getSnapshot(in: context) { (entry) in
                let timeline = Timeline(entries: [entry], policy: .atEnd)
                completion(timeline)
            }
        }
    }
    
    struct ExampleEntry: TimelineEntry {
        let date: Date
        let title: String
        let message: String
    }
    
    struct HomeWidgetExampleEntryView : View {
        var entry: Provider.Entry
        let data = UserDefaults.init(suiteName:widgetGroupId)
    
        var body: some View {
            VStack.init(alignment: .leading, spacing: /*@START_MENU_TOKEN@*/nil/*@END_MENU_TOKEN@*/, content: {
                Text(entry.title).bold().font(/*@START_MENU_TOKEN@*/.title/*@END_MENU_TOKEN@*/)
                Text(entry.message).font(.body)
            }
            )}
    }
    
    @main
    struct HomeWidgetExample: Widget {
        let kind: String = "nct_home_widget"
    
        var body: some WidgetConfiguration {
            StaticConfiguration(kind: kind, provider: Provider()) { entry in
                HomeWidgetExampleEntryView(entry: entry)
            }
            .configurationDisplayName("nct_home_widget")
            .description("nct_home_widget")
        }
    }
    
    struct HomeWidgetExample_Previews: PreviewProvider {
        static var previews: some View {
            HomeWidgetExampleEntryView(entry: ExampleEntry(date: Date(), title: "nct_home_widget", message: "nct_home_widget"))
                .previewContext(WidgetPreviewContext(family: .systemSmall))
        }
    }
    
    iOS 
    opened by huytower 15
  • Unresolved reference: R

    Unresolved reference: R

    I copied files in kotlin/es/antonborri/home_widget_example and launched main.dart but it says Unresolved reference: R

    I think that this line makes error.

    val views = RemoteViews(context.packageName, R.layout.example_layout).apply {

    Do I have to import R to my project?

    Android 
    opened by tomriddle7 12
  • MissingPluginException(No implementation found for method registerBackgroundCallback on channel home_widget)

    MissingPluginException(No implementation found for method registerBackgroundCallback on channel home_widget)

    Fairly new to all of this. I had Android working perfectly and tried to add an ios widget. I'm using workmanager to try to update the widget in the back ground. However I am getting this error.

    The error also occurs on the example app.

    For me this error occurs when I try to get data from an api using the http package.

    [VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: MissingPluginException(No implementation found for method registerBackgroundCallback on channel home_widget) #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7) [VERBOSE-2:ui_dart_state.cc(199)] Unhandled Exception: PlatformException(Error 8, kCLErrorDomain, The operation couldn’t be completed. (kCLErrorDomain error 8.), null) #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:597:7) #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:158:18) #2 LocalGeocoding.findAddressesFromQuery (package:geocoder/services/local.dart:18:28) #3 _WeatherAppState.getLatLngFromLocation (package:weatherapp/main.dart:614:21)

    As I'm new to this - please let me know what you need.

    opened by roly151 9
  • Unable to instantiate receiver

    Unable to instantiate receiver

    Hello! I am having problems with the library. I tried to integrate the example from the library into my project, but I got the following problem:

    E/AndroidRuntime(27577): java.lang.RuntimeException: Unable to instantiate receiver com.vadimrm.clastere.HomeWidgetProvider: java.lang.ClassNotFoundException: Didn't find class "com.vadimrm.clastere.HomeWidgetProvider" on path: DexPathList[[zip file "/data/app/~~88u_Wa5GQ7Svqajbbr4qdw==/com.vadimrm.clastere-0pEzhjkNxr5w8bTWaCZNsg==/base.apk"],nativeLibraryDirectories=[/data/app/~~88u_Wa5GQ7Svqajbbr4qdw==/com.vadimrm.clastere-0pEzhjkNxr5w8bTWaCZNsg==/lib/x86, /data/app/~~88u_Wa5GQ7Svqajbbr4qdw==/com.vadimrm.clastere-0pEzhjkNxr5w8bTWaCZNsg==/base.apk!/lib/x86, /system/lib, /system_ext/lib]]
    E/AndroidRuntime(27577): 	at android.app.ActivityThread.handleReceiver(ActivityThread.java:4018)
    E/AndroidRuntime(27577): 	at android.app.ActivityThread.access$1400(ActivityThread.java:237)
    E/AndroidRuntime(27577): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1924)
    E/AndroidRuntime(27577): 	at android.os.Handler.dispatchMessage(Handler.java:106)
    E/AndroidRuntime(27577): 	at android.os.Looper.loop(Looper.java:223)
    E/AndroidRuntime(27577): 	at android.app.ActivityThread.main(ActivityThread.java:7656)
    E/AndroidRuntime(27577): 	at java.lang.reflect.Method.invoke(Native Method)
    E/AndroidRuntime(27577): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    E/AndroidRuntime(27577): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
    E/AndroidRuntime(27577): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vadimrm.clastere.HomeWidgetProvider" on path: DexPathList[[zip file "/data/app/~~88u_Wa5GQ7Svqajbbr4qdw==/com.vadimrm.clastere-0pEzhjkNxr5w8bTWaCZNsg==/base.apk"],nativeLibraryDirectories=[/data/app/~~88u_Wa5GQ7Svqajbbr4qdw==/com.vadimrm.clastere-0pEzhjkNxr5w8bTWaCZNsg==/lib/x86, /data/app/~~88u_Wa5GQ7Svqajbbr4qdw==/com.vadimrm.clastere-0pEzhjkNxr5w8bTWaCZNsg==/base.apk!/lib/x86, /system/lib, /system_ext/lib]]
    E/AndroidRuntime(27577): 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:207)
    E/AndroidRuntime(27577): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    E/AndroidRuntime(27577): 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    E/AndroidRuntime(27577): 	at android.app.AppComponentFactory.instantiateReceiver(AppComponentFactory.java:110)
    E/AndroidRuntime(27577): 	at androidx.core.app.CoreComponentFactory.instantiateReceiver(CoreComponentFactory.java:60)
    E/AndroidRuntime(27577): 	at android.app.ActivityThread.handleReceiver(ActivityThread.java:4011)
    E/AndroidRuntime(27577): 	... 8 more
    I/Process (27577): Sending signal. PID: 27577 SIG: 9
    

    android/build.gradle

    buildscript {
        repositories {
            google()
            jcenter()
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:4.1.0'
            classpath 'com.google.gms:google-services:4.3.5'
            classpath 'com.google.firebase:firebase-crashlytics-gradle:2.2.0'
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
        }
    }
    
    rootProject.buildDir = '../build'
    subprojects {
        project.buildDir = "${rootProject.buildDir}/${project.name}"
    }
    subprojects {
        project.evaluationDependsOn(':app')
    }
    
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    

    app/build.gradle

    def localProperties = new Properties()
    def localPropertiesFile = rootProject.file('local.properties')
    if (localPropertiesFile.exists()) {
        localPropertiesFile.withReader('UTF-8') { reader ->
            localProperties.load(reader)
        }
    }
    
    def flutterRoot = localProperties.getProperty('flutter.sdk')
    if (flutterRoot == null) {
        throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
    }
    
    def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
    if (flutterVersionCode == null) {
        flutterVersionCode = '1'
    }
    
    def flutterVersionName = localProperties.getProperty('flutter.versionName')
    if (flutterVersionName == null) {
        flutterVersionName = '1.0'
    }
    
    apply plugin: 'com.android.application'
    apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
    apply plugin: 'com.google.gms.google-services'
    apply plugin: 'com.google.firebase.crashlytics'
    def keystoreProperties = new Properties()
    def keystorePropertiesFile = rootProject.file('key.properties')
    if (keystorePropertiesFile.exists()) {
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    }
    android {
        compileSdkVersion 29
    
        lintOptions {
            disable 'InvalidPackage'
        }
    
        defaultConfig {
            applicationId "com.vadimrm.clastere"
            minSdkVersion 23
            targetSdkVersion 29
            versionCode flutterVersionCode.toInteger()
            versionName flutterVersionName
        }
        signingConfigs {
            release {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
                storePassword keystoreProperties['storePassword']
            }
        }
        buildTypes {
            release {
                signingConfig signingConfigs.release
            }
        }
        buildTypes {
            release {
                // Signing with the debug keys for now, so `flutter run --release` works.
                signingConfig signingConfigs.debug
            }
        }
    }
    
    flutter {
        source '../..'
    }
    

    project structure: image Android manifest:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.vadimrm.clastere">
        <!-- io.flutter.app.FlutterApplication is an android.app.Application that
             calls FlutterMain.startInitialization(this); in its onCreate method.
             In most cases you can leave this as-is, but you if you want to provide
             additional functionality it is fine to subclass or reimplement
             FlutterApplication and put your custom class here. -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-sdk
            android:minSdkVersion="8" />
        <application
            android:label="Clastere"
            android:icon="@mipmap/ic_launcher"
            android:networkSecurityConfig="@xml/network_security_config">
            <provider
                android:name="sk.fourq.otaupdate.OtaUpdateFileProvider"
                android:authorities="${applicationId}.ota_update_provider"
                android:exported="false"
                android:grantUriPermissions="true">
                <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths" />
            </provider>
            <meta-data
                android:name="com.google.android.gms.ads.APPLICATION_ID"
                android:value="secret"/>
            <meta-data
                android:name="com.google.android.gms.ads.AD_MANAGER_APP"
                android:value="true"/>
            <activity
                android:name=".MainActivity"
                android:screenOrientation="portrait"
                android:launchMode="singleTop"
                android:theme="@style/LaunchTheme"
                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
                android:hardwareAccelerated="true"
                android:windowSoftInputMode="adjustResize">
                <!-- Specifies an Android theme to apply to this Activity as soon as
                     the Android process has started. This theme is visible to the user
                     while the Flutter UI initializes. After that, this theme continues
                     to determine the Window background behind the Flutter UI. -->
                <meta-data
                  android:name="io.flutter.embedding.android.NormalTheme"
                  android:resource="@style/NormalTheme"
                  />
                <!-- Displays an Android View that continues showing the launch screen
                     Drawable until Flutter paints its first frame, then this splash
                     screen fades out. A splash screen is useful to avoid any visual
                     gap between the end of Android's launch screen and the painting of
                     Flutter's first frame. -->
                <meta-data
                  android:name="io.flutter.embedding.android.SplashScreenDrawable"
                  android:resource="@drawable/launch_background"
                  />
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
    
            <receiver android:name="HomeWidgetProvider" >
                <intent-filter>
                    <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                </intent-filter>
                <meta-data android:name="android.appwidget.provider"
                    android:resource="@xml/widget" />
            </receiver>
    
            <!-- Don't delete the meta-data below.
                 This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
            <meta-data
                android:name="flutterEmbedding"
                android:value="2" />
        </application>
    </manifest>
    

    HomeWidgetProvider.kt

    package com.vadimrm.clastere
    
    import android.appwidget.AppWidgetManager
    import android.content.Context
    import android.content.SharedPreferences
    import android.net.Uri
    import android.widget.RemoteViews
    import es.antonborri.home_widget.HomeWidgetBackgroundIntent
    import es.antonborri.home_widget.HomeWidgetLaunchIntent
    import es.antonborri.home_widget.HomeWidgetProvider
    
    class HomeWidgetExampleProvider : HomeWidgetProvider() {
    
        override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray, widgetData: SharedPreferences) {
            appWidgetIds.forEach { widgetId ->
                val views = RemoteViews(context.packageName, R.layout.widget).apply {
                    // Open App on Widget Click
                    val pendingIntent = HomeWidgetLaunchIntent.getActivity(
                            context,
                            MainActivity::class.java)
                    setOnClickPendingIntent(R.id.widget_container, pendingIntent)
    
                    // Swap Title Text by calling Dart Code in the Background
                    setTextViewText(R.id.widget_title, widgetData.getString("title", null)
                            ?: "No Title Set")
                    val backgroundIntent = HomeWidgetBackgroundIntent.getBroadcast(
                            context,
                            Uri.parse("homeWidgetExample://titleClicked")
                    )
                    setOnClickPendingIntent(R.id.widget_title, backgroundIntent)
    
                    val message = widgetData.getString("message", null)
                    setTextViewText(R.id.widget_message, message
                            ?: "No Message Set")
                    // Detect App opened via Click inside Flutter
                    val pendingIntentWithData = HomeWidgetLaunchIntent.getActivity(
                            context,
                            MainActivity::class.java,
                            Uri.parse("homeWidgetExample://message?message=$message"))
                    setOnClickPendingIntent(R.id.widget_message, pendingIntentWithData)
                }
    
                appWidgetManager.updateAppWidget(widgetId, views)
            }
        }
    }
    

    I am new to android development. I would really appreciate your help

    Android 
    opened by vadim-rm 9
  • Add click button on widget

    Add click button on widget

    Hello,

    I applied this library success, I add more feature when using this.

    • Show title & message (done)
    • A button for integrate : Play button (doing) Screen Shot 2020-11-16 at 14 17 26

    I did not found any document details the method like setOnClickListener() (or setTextViewText()) to apply (Even Ctril+Space does not help me also) So how I implemented a clicked button success?

    Please help me indicate that?

    Code lines : Screen Shot 2020-11-16 at 14 17 54 Screen Shot 2020-11-16 at 14 18 11

    [✓] Flutter (Channel stable, 1.22.3, on macOS 11.0.1 20B29, locale en-VN) • Flutter version 1.22.3 at /Users/huytd/flutter • Framework revision 8874f21e79 (2 weeks ago), 2020-10-29 14:14:35 -0700 • Engine revision a1440ca392 • Dart version 2.10.3

    [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.2) • Android SDK at /Users/huytd/android-sdk • Platform android-30, build-tools 30.0.2 • ANDROID_HOME = /Users/huytd/android-sdk • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495) • All Android licenses accepted.

    [✓] Xcode - develop for iOS and macOS (Xcode 12.2) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 12.2, Build version 12B45b • CocoaPods version 1.10.0

    [!] Android Studio (version 4.1) • Android Studio at /Applications/Android Studio.app/Contents ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6915495)

    [✓] Connected device (1 available) • Android SDK built for x86 (mobile) • emulator-5554 • android-x86 • Android 7.1.1 (API 25) (emulator)

    Android 
    opened by huytower 7
  • 'package:home_widget/home_widget_callback_dispatcher.dart' not found

    'package:home_widget/home_widget_callback_dispatcher.dart' not found

    I am trying to use the backgroundCallback to refresh my widget by pressing an image on the widget. It works fine on debug mode, however when I build apk or run flutter run --release --verbose I get the error below (well in apk I can't see the error but it does not work either).

    I get this error after tapping the image with the callback URI:

    [ +9 ms] E/flutter (14277): [ERROR:flutter/shell/common/shell.cc(88)] Dart Error: Dart_LookupLibrary: library 'package:home_widget/home_widget_callback_dispatcher.dart' not found. [ ] E/flutter (14277): [ERROR:flutter/runtime/dart_isolate.cc(668)] Could not resolve main entrypoint function. [ ] E/flutter (14277): [ERROR:flutter/runtime/dart_isolate.cc(167)] Could not run the run main Dart entrypoint. [ ] E/flutter (14277): [ERROR:flutter/runtime/runtime_controller.cc(386)] Could not create root isolate. [ ] E/flutter (14277): [ERROR:flutter/shell/common/shell.cc(605)] Could not launch engine with configuration. [ +28 ms] W/FlutterJNI(14277): FlutterJNI.loadLibrary called more than once [ ] W/FlutterJNI(14277): FlutterJNI.prefetchDefaultFontManager called more than once [ ] W/FlutterJNI(14277): FlutterJNI.init called more than once [ +8 ms] E/flutter (14277): [ERROR:flutter/runtime/dart_isolate.cc(668)] Could not resolve main entrypoint function. [ ] E/flutter (14277): [ERROR:flutter/runtime/dart_isolate.cc(167)] Could not run the run main Dart entrypoint. [ ] E/flutter (14277): [ERROR:flutter/runtime/runtime_controller.cc(386)] Could not create root isolate. [ ] E/flutter (14277): [ERROR:flutter/shell/common/shell.cc(605)] Could not launch engine with configuration.

    That makes no sense to me. What confuses me is that it is working fine in Debug. You can see here that the file is in my package beside the other one.

    Doctor summary:

    [✓] Flutter (Channel master, 3.4.0-19.0.pre.35, on Microsoft Windows [Version 10.0.22000.856], locale en-CA) [✓] Android toolchain - develop for Android devices (Android SDK version 32.1.0-rc1) [✓] Chrome - develop for the web [✗] Visual Studio - develop for Windows ✗ Visual Studio not installed; this is necessary for Windows development. Download at https://visualstudio.microsoft.com/downloads/. Please install the "Desktop development with C++" workload, including all of its default components [✓] Android Studio (version 2021.2) [✓] VS Code, 64-bit edition (version 1.67.2) [✓] Connected device (4 available) [✓] HTTP Host Availability

    opened by saad197 5
  • iOS widget doesn't update

    iOS widget doesn't update

    Hello, my iOS widget won't give me an error (the function returns true), and it won't update the widget either.

    I set my group id as group.salamlabs.salamapp.HomeWidget and it is configured correctly.

    AppDelegate.swift

    import UIKit
    import Flutter
    import workmanager
    
    @UIApplicationMain
    @objc class AppDelegate: FlutterAppDelegate {
      override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
      ) -> Bool {
          UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15))
           //return true
     
    //   if #available(iOS 10.0, *) {
    //     UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
    //   }
          GeneratedPluginRegistrant.register(with: self)
          UNUserNotificationCenter.current().delegate = self
    WorkmanagerPlugin.setPluginRegistrantCallback { registry in
        GeneratedPluginRegistrant.register(with: registry)
    }
    
    
    
                 return super.application(application, didFinishLaunchingWithOptions: launchOptions)
          }
    
          override func userNotificationCenter(
                  _ center: UNUserNotificationCenter,
                  willPresent notification: UNNotification,
                  withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
                   completionHandler(.alert) // shows banner even if app is in foreground
               }
    
    
    }
    

    HomeWidget.swift

    //
    //  HomeWidget.swift
    //  HomeWidget
    //
    //  Created by Ismail Fateen on 11/06/2022.
    //
    
    import WidgetKit
    import SwiftUI
    
    private let widgetGroupId = "group.salamlabs.salamapp.HomeWidget"
    
    struct Provider: TimelineProvider {
        func placeholder(in context: Context) -> ExampleEntry {
            ExampleEntry(date: Date(), title: "Placeholder Title", message: "Placeholder Message")
        }
        
        func getSnapshot(in context: Context, completion: @escaping (ExampleEntry) -> ()) {
            let data = UserDefaults.init(suiteName:widgetGroupId)
            let entry = ExampleEntry(date: Date(), title: data?.string(forKey: "title") ?? "No tiTLE sET", message: data?.string(forKey: "message") ?? "No meSSaGE sEt")
            completion(entry)
        }
        
        func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
            getSnapshot(in: context) { (entry) in
                let timeline = Timeline(entries: [entry], policy: .atEnd)
                completion(timeline)
            }
        }
    }
    
    struct ExampleEntry: TimelineEntry {
        let date: Date
        let title: String
        let message: String
    }
    
    struct HomeWidgetExampleEntryView : View {
        var entry: Provider.Entry
        let data = UserDefaults.init(suiteName:widgetGroupId)
        
        var body: some View {
            VStack.init(alignment: .leading, spacing: nil, content: {
                Text(entry.title).bold().font(.title)
                Text(entry.message)
                    .font(.body)
                    .widgetURL(URL(string: "homeWidgetExample://message?message=\(entry.message)&homeWidget"))
            }
            )
        }
    }
    
    @main
    struct HomeWidgetExample: Widget {
        let kind: String = "HomeWidget"
        
        var body: some WidgetConfiguration {
            StaticConfiguration(kind: kind, provider: Provider()) { entry in
                HomeWidgetExampleEntryView(entry: entry)
            }
            .configurationDisplayName("My Widget")
            .description("This is an example widget.")
        }
    }
    
    struct HomeWidgetExample_Previews: PreviewProvider {
        static var previews: some View {
            HomeWidgetExampleEntryView(entry: ExampleEntry(date: Date(), title: "Example Title", message: "Example Message"))
                .previewContext(WidgetPreviewContext(family: .systemSmall))
        }
    }
    

    Code that “updates” the widget:

                      await HomeWidget.setAppGroupId(
                          "group.salamlabs.salamapp.HomeWidget");
                      await HomeWidget.saveWidgetData("title", "yes");
                      await HomeWidget.saveWidgetData("message", "no");
                      var result = await HomeWidget.updateWidget(
                          iOSName: "HomeWidget", name: "HomeWidget");
                      print(result.toString()); // prints `true`, doesn't update
    

    flutter doctor -v

    [✓] Flutter (Channel stable, 2.10.5, on macOS 13.0 22A5266r darwin-arm, locale
        en-EG)
        • Flutter version 2.10.5 at /opt/flutter
        • Upstream repository https://github.com/flutter/flutter.git
        • Framework revision 5464c5bac7 (8 weeks ago), 2022-04-18 09:55:37 -0700
        • Engine revision 57d3bac3dd
        • Dart version 2.16.2
        • DevTools version 2.9.2
    
    [✓] Android toolchain - develop for Android devices (Android SDK version
        32.1.0-rc1)
        • Android SDK at /Users/ismailfateen/Library/Android/sdk
        • Platform android-32, build-tools 32.1.0-rc1
        • Java binary at: /Applications/Android
          Studio.app/Contents/jre/Contents/Home/bin/java
        • Java version OpenJDK Runtime Environment (build
          11.0.12+0-b1504.28-7817840)
        • All Android licenses accepted.
    
    [✓] Xcode - develop for iOS and macOS (Xcode 13.4.1)
        • Xcode at /Applications/Xcode.app/Contents/Developer
        • CocoaPods version 1.11.3
    
    [✓] Chrome - develop for the web
        • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
    
    [✓] Android Studio (version 2021.2)
        • Android Studio at /Applications/Android Studio.app/Contents
        • Flutter plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/9212-flutter
        • Dart plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/6351-dart
        • Java version OpenJDK Runtime Environment (build
          11.0.12+0-b1504.28-7817840)
    
    [✓] IntelliJ IDEA Community Edition (version 2022.1.1)
        • IntelliJ at /Applications/IntelliJ IDEA CE.app
        • Flutter plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/9212-flutter
        • Dart plugin can be installed from:
          🔨 https://plugins.jetbrains.com/plugin/6351-dart
    
    [✓] VS Code (version 1.68.0)
        • VS Code at /Applications/Visual Studio Code.app/Contents
        • Flutter extension version 3.42.0
    
    [✓] Connected device (2 available)
        • iPhone SE (3rd generation) (mobile) • 393BE168-DDAA-4F01-9ED8-63624660D2FD
          • ios            • com.apple.CoreSimulator.SimRuntime.iOS-15-5 (simulator)
        • Chrome (web)                        • chrome
          • web-javascript • Google Chrome 102.0.5005.61
    
    [✓] HTTP Host Availability
        • All required HTTP hosts are available
    
    • No issues found!
    
    opened by ismailfateen 5
  • Multiple Widgets

    Multiple Widgets

    Is it possible to have multiple widgets that update in the background? I have managed to get two widgets, but cannot get one of them to update in the background.

    I have two HomeWidgetProvider Classes, two widget info xml's, two layout xml's, and have two receivers in the manifest. I only have one of the following - I'm assuming this is okay? <receiver android:name="es.antonborri.home_widget.HomeWidgetBackgroundReceiver"> <intent-filter> <action android:name="com.resortstylebeanbags.localweatherau.action.BACKGROUND" /> </intent-filter> </receiver> <service android:name="es.antonborri.home_widget.HomeWidgetBackgroundService" android:permission="android.permission.BIND_JOB_SERVICE" android:exported="true"/>

    opened by roly151 5
  • [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: type 'bool' is not a subtype of type 'String?' in type cast

    [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: type 'bool' is not a subtype of type 'String?' in type cast

    i have an error when i click the arrow back on android and then i open the app with the home screen widget.

    [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception: type 'bool' is not a subtype of type 'String?' in type cast E/flutter (14900): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:158:41) E/flutter (14900): .

    this is the erro, i try to check this, but i can't resolved, it just happen when you go back and then u click the widget to open the app again cause android destroy the app, and then idk why cannot rebuild well. Destroying service. D/FlutterLocationService(14900): Creating service. D/FlutterLocationService(14900): Binding to location service.

    bug 
    opened by chame10 5
  • new compilation error in flutter 3.0.0

    new compilation error in flutter 3.0.0

    e: D:\flutter\flutter\.pub-cache\hosted\pub.dartlang.org\home_widget-0.1.5\android\src\main\kotlin\es\antonborri\home_widget\HomeWidgetPlugin.kt: (19, 1): Class 'HomeWidgetPlugin' is not abstract and does not implement abstract member public abstract fun onNewIntent(p0: Intent): Boolean defined in io.flutter.plugin.common.PluginRegistry.NewIntentListener
    e: D:\flutter\flutter\.pub-cache\hosted\pub.dartlang.org\home_widget-0.1.5\android\src\main\kotlin\es\antonborri\home_widget\HomeWidgetPlugin.kt: (193, 5): 'onNewIntent' overrides nothing
    
    opened by setcy 4
  • ListView Help

    ListView Help

    I have been trying to figure out how to add a ListView with programmatically updatable TextViews within the ListView but I am unsure of how to accomplish this. Does anyone have any suggestions?

    Thank you

    opened by Nightbl927 4
  • Does not work after version 3.0.5 of flutter (home_widget 0.1.6)

    Does not work after version 3.0.5 of flutter (home_widget 0.1.6)

    If you use flutter > 3.0.5 you get this error if you build in release-mode and try a buttonclick on the widget: https://stackoverflow.com/questions/74675682/flutter-dart-error-dart-lookuplibrary-library-packagehome-widget-home-widget

    the solution with @pragma('vm:entry-point') doesnt work for me

    Plugin works with this setup:

    pubspec.yaml environment: sdk: '>=2.17.0 <3.0.0'

    with flutter version 3.0.5

    "--release flag won't let service extensions run (see the docs here)." https://stackoverflow.com/a/73613366

    "Service extensions are disabled." https://docs.flutter.dev/testing/build-modes#release

    EDIT: oh maybe it needs to be @pragma("vm:entry-point") with doublequotes instead of @pragma('vm:entry-point') it worked now with flutter 3.3.10 (and environment: sdk: '>=2.17.6 <3.0.0')

    opened by baststar 0
  • Trouble with just_audio, just_audio_background, or audio_service

    Trouble with just_audio, just_audio_background, or audio_service

    When adding adding libraries just_audio, just_audio_background, or audio_service, which require changing class MainActivity : FlutterActivity() to class MainActivity : com.ryanheise.audioservice.AudioServiceActivity(), the behavior is unexpected. See ticket here https://github.com/ryanheise/audio_service/issues/875#issuecomment-1369020543

    opened by adrianvintu 0
  • Loading between updates

    Loading between updates

    When i call await HomeWidget.updateWidget to change my Widget tab or info, the android widget has a fast change to "Loading..." and then the new data appears, is there any way to avoid this?

    https://user-images.githubusercontent.com/10541221/206686211-90104a32-7739-49d9-b56a-f71ca101a702.mp4

    opened by thize 0
  • Error with sdk: =2.16.1 <3.0.0"">

    Error with sdk: ">=2.16.1 <3.0.0"

    with the sdk: ">=2.16.1 <3.0.0" error in: void initState() { super.initState(); HomeWidget.setAppGroupId('YOUR_GROUP_ID'); HomeWidget.registerBackgroundCallback(backgroundCallback); // ERROR HERE }

    /* The argument type 'void Function(Uri)' can't be assigned to the parameter type 'dynamic Function(Uri?)'. */

    unfortunately I can't change my sdk, are there any solutions?

    opened by virtualars 0
  • HomeWidget.registerBackgroundCallback() throwing error

    HomeWidget.registerBackgroundCallback() throwing error

    HomeWidget.registerBackgroundCallback() is not working

    My Code:

    void registerHomeWidgetCallback() async {
        Logger.debug('Registering HomeWidget callback');
        var res = await HomeWidget.registerBackgroundCallback(homeWidgetBackgroundCallback);
        Logger.data('HomeWidget callback status: $res');
      }
    
    dynamic homeWidgetBackgroundCallback(Uri? uri) {}
    

    Error:

    [log] Registering HomeWidget callback
    
    E/MethodChannel#home_widget(13331): Failed to handle method call
    
    E/MethodChannel#home_widget(13331): java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Number
    
    E/MethodChannel#home_widget(13331): 	at es.antonborri.home_widget.HomeWidgetPlugin.onMethodCall(HomeWidgetPlugin.kt:106)
    
    E/MethodChannel#home_widget(13331): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
    
    E/MethodChannel#home_widget(13331): 	at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295)
    
    E/MethodChannel#home_widget(13331): 	at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$DartMessenger(DartMessenger.java:319)
    
    E/MethodChannel#home_widget(13331): 	at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$TsixYUB5E6FpKhMtCSQVHKE89gQ.run(Unknown Source:12)
    
    E/MethodChannel#home_widget(13331): 	at android.os.Handler.handleCallback(Handler.java:942)
    
    E/MethodChannel#home_widget(13331): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    
    E/MethodChannel#home_widget(13331): 	at android.os.Looper.loopOnce(Looper.java:201)
    
    E/MethodChannel#home_widget(13331): 	at android.os.Looper.loop(Looper.java:288)
    
    E/MethodChannel#home_widget(13331): 	at android.app.ActivityThread.main(ActivityThread.java:7902)
    
    E/MethodChannel#home_widget(13331): 	at java.lang.reflect.Method.invoke(Native Method)
    
    E/MethodChannel#home_widget(13331): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:553)
    
    E/MethodChannel#home_widget(13331): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
    
    I/ExoPlayerImpl(13331): Init 45cd16b [ExoPlayerLib/2.17.1] [bhima, ZTE A2020G Pro, Xiaomi, 33]
    
    E/flutter (13331): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(error, null cannot be cast to non-null type kotlin.Number, null, java.lang.NullPointerException: null cannot be cast to non-null type kotlin.Number
    
    E/flutter (13331): 	at es.antonborri.home_widget.HomeWidgetPlugin.onMethodCall(HomeWidgetPlugin.kt:106)
    
    E/flutter (13331): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262)
    
    E/flutter (13331): 	at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295)
    
    E/flutter (13331): 	at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$DartMessenger(DartMessenger.java:319)
    
    E/flutter (13331): 	at io.flutter.embedding.engine.dart.-$$Lambda$DartMessenger$TsixYUB5E6FpKhMtCSQVHKE89gQ.run(Unknown Source:12)
    
    E/flutter (13331): 	at android.os.Handler.handleCallback(Handler.java:942)
    
    E/flutter (13331): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    
    E/flutter (13331): 	at android.os.Looper.loopOnce(Looper.java:201)
    
    E/flutter (13331): 	at android.os.Looper.loop(Looper.java:288)
    
    E/flutter (13331): 	at android.app.ActivityThread.main(ActivityThread.java:7902)
    
    E/flutter (13331): 	at java.lang.reflect.Method.invoke(Native Method)
    
    E/flutter (13331): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:553)
    
    E/flutter (13331): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
    
    E/flutter (13331): )
    
    E/flutter (13331): #0      StandardMethodCodec.decodeEnvelope package:flutter/…/services/message_codecs.dart:653
    E/flutter (13331): #1      MethodChannel._invokeMethod package:flutter/…/services/platform_channel.dart:296
    
    E/flutter (13331): <asynchronous suspension>
    
    E/flutter (13331): #2      PlayerBloc.registerHomeWidgetCallback
    package:music_player/…/player/player_bloc.dart:167
    
    E/flutter (13331): <asynchronous suspension>
    
    opened by VasuGajjar 2
Releases(v0.2.0)
Owner
Anton Borries
Anton Borries
This Flutter project recreates an electronics store home screen mockup.

E-Store Mobile App Home Screen This Flutter project recreates an electronics store home screen mockup. The mockup was created by @nasyiya.design on in

Azarro 34 Jul 2, 2022
Actor model implementation in Dart. This package makes it easier to work with isolates, create clusters of isolates.

Actor model implementation in Dart Languages: Introduction About Theater Installing What is Actor Notes about the actors Actor system Actor tree Using

Gleb Batykov 39 Nov 14, 2022
A performant, expressjs like server framework with a few gadgets that make life even easier.

Alfred A performant, expressjs like server framework thats easy to use and has all the bits in one place. Quickstart: import 'package:alfred/alfred.da

Ryan Knell 449 Jan 2, 2023
A Deep Learning Based Attendance System is a mobile application that aims to make it easier for lecturers to check the attendance status of students which are attending the course.

Attendance System / Flutter App A Deep Learning Based Attendance System is a mobile application that aims to make it easier for lecturers to check the

Merthan Kavak 11 Oct 24, 2022
This app is designed to make the preparation for see easier.

science A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this

Nishant Pokhrel 2 Jun 20, 2022
🛍 A full E-commerce app with nice UI consists of on-boarding, login, sign-up, home, product details, cart and user profile.

About (Download) ?? A full E-commerce app with nice UI consists of on-boarding, login, sign-up, home, product details, cart and user profile. ?? Scree

null 56 Nov 27, 2022
Smart Home Controlling App

wifi_smart_home_five Hinox Wifi Smart Home App Getting Started This project is a starting point for a Flutter application. A few resources to get you

Hiloliddin 1 Nov 10, 2021
A timer app to help with timing home workouts

time_app A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if this

null 0 Jan 3, 2022
To cure symptoms of various disease using medicines at home this app will act as guideline. Few animations are used and Firebase is used as database.

Medkit It's a Pharmacy application that help you in curing basic symptoms and diseases with medicines available in your home. How to Run Code Clone or

Muhammad Hamza 109 Dec 22, 2022
A flutter package which contains a collection of Splash Screen example for your app to display logo and different text style.

splash_screen_view They say, first impression is the last! Yep, truly for any amazingly crafted application, it's easier to start impressing your audi

Sandip Kalola (SK) 17 Nov 25, 2022
A Flutter package for building custom skeleton widgets to mimic the page's layout while loading.

Skeletons A Flutter package for building custom skeleton widgets to mimic the page's layout while loading. Examples Items ListView (Default) ListView

Moh Badjah 46 Dec 17, 2022
A low-cost Flutter screen adaptation solution(一个极低成本的 Flutter 屏幕适配方案)

A low-cost Flutter screen adaptation solution(一个极低成本的 Flutter 屏幕适配方案) 100% 还原 UI,只需要按照设计图写的宽高写即可 先看图片,设置的标准宽度是 360 iPhone 8 --------------------------

聂志洋 108 Sep 27, 2022
A flutter app face detection and emotion, can detect if you're smiling, big smiley, sad or if there is not face on the screen.

My Emotion A flutter app face detection and emotion, can detect if you're smiling, big smiley, sad or if there is not face on the screen. News feactur

António Nicolau 29 Dec 31, 2022
Flutter Web application having splash screen and providing Web view Using web view packege.

Webview with Splash Screen in Flutter Flutter Web View With Splash Screen. Subscribe Our YouTube Channel. Visit Website Demo OutPut ?? Links Getting S

Habib ullah 1 Dec 7, 2021
A Beautiful Onboarding UI Screen For Flutter

onboarding_ui Untitled.design.mp4

Ramesh M S 9 Apr 7, 2022
A flutter example demo of how to use the screen capture.

zego_express_example_screen_capture_flutter A flutter example demo of how to implement live broadcast of screen capture using ZEGO Express Audio and V

ZEGO 36 Jan 1, 2023
Simple animated cola splash screen as shown below

cola_splash_screen Description Simple animated cola splash screen as shown below pixels.3.2.mp4 My Contacts If you have any question about the repo or

null 2 Nov 16, 2021
Splash Screen with liquid swipe effect!

liquid_swipe_intro A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you start

Flutter Boy 21 Dec 30, 2022
Floating panel let's you create quick Floating menu for the screen.

Flutter Float Box Float Box - v1.0 Overview Float box is a true floating panel for your app, which can be docked to either edges of the screen (horizo

Akshaye JH 25 Nov 25, 2022