From 64599ea9ebccbf7397071ab64dc4a3d85647b613 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:00:17 -0800 Subject: [PATCH 01/16] Draft of some possible native interop updates --- .../android/jni-call-lifecycle-dark.svg | 4 + .../android/jni-call-lifecycle-light.png | Bin 0 -> 128564 bytes .../android/jni-call-lifecycle-light.svg | 4 + ...ll-jetpack-apis.md => call-native-apis.md} | 4 +- .../android/compose-activity.md | 373 +++++++++++++++++- .../platform-integration/android/jnigen.md | 243 ++++++++++++ .../android/request-permission.md | 195 +++++++++ .../native-code-options.md | 56 +++ .../platform-integration/platform-channels.md | 6 +- src/data/sidenav/default.yml | 18 +- 10 files changed, 890 insertions(+), 13 deletions(-) create mode 100644 site/web/assets/images/android/jni-call-lifecycle-dark.svg create mode 100644 site/web/assets/images/android/jni-call-lifecycle-light.png create mode 100644 site/web/assets/images/android/jni-call-lifecycle-light.svg rename src/content/platform-integration/android/{call-jetpack-apis.md => call-native-apis.md} (97%) create mode 100644 src/content/platform-integration/android/jnigen.md create mode 100644 src/content/platform-integration/android/request-permission.md create mode 100644 src/content/platform-integration/native-code-options.md diff --git a/site/web/assets/images/android/jni-call-lifecycle-dark.svg b/site/web/assets/images/android/jni-call-lifecycle-dark.svg new file mode 100644 index 00000000000..f21306c8840 --- /dev/null +++ b/site/web/assets/images/android/jni-call-lifecycle-dark.svg @@ -0,0 +1,4 @@ + + +Android APIsFlutter AppBindingsC/C++NDK - Native Development KitJava Native InterfaceLifecycle of a Java Native Interface(JNI) Call \ No newline at end of file diff --git a/site/web/assets/images/android/jni-call-lifecycle-light.png b/site/web/assets/images/android/jni-call-lifecycle-light.png new file mode 100644 index 0000000000000000000000000000000000000000..38cbb9992b2e8f52d7a325c2502fb1d0a50e2166 GIT binary patch literal 128564 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 SVpkRB=G0XlDwile4*frOt;_QO literal 0 HcmV?d00001 diff --git a/site/web/assets/images/android/jni-call-lifecycle-light.svg b/site/web/assets/images/android/jni-call-lifecycle-light.svg new file mode 100644 index 00000000000..b10c537f6ec --- /dev/null +++ b/site/web/assets/images/android/jni-call-lifecycle-light.svg @@ -0,0 +1,4 @@ + + +Android APIsFlutter AppBindingsC/C++NDK - Native Development KitJava Native InterfaceLifecycle of a Java Native Interface(JNI) Call \ No newline at end of file diff --git a/src/content/platform-integration/android/call-jetpack-apis.md b/src/content/platform-integration/android/call-native-apis.md similarity index 97% rename from src/content/platform-integration/android/call-jetpack-apis.md rename to src/content/platform-integration/android/call-native-apis.md index d2476b9145d..d29f800ed37 100644 --- a/src/content/platform-integration/android/call-jetpack-apis.md +++ b/src/content/platform-integration/android/call-native-apis.md @@ -1,6 +1,6 @@ --- -title: "Calling JetPack APIs" -description: "Use the latest Android APIs from your Dart code" +title: "Calling Native APIs" +description: "Use an Android API directly from Flutter code" --- diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index 30e84b6674f..5d23ffd1f4c 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -15,8 +15,24 @@ you will have access to the full breadth of native Android functionality. Adding this functionality requires making several changes to your Flutter app and its internal, generated Android app. + +There are two ways to do it: Either using `jnigen` or Method Channels. + +## Overview of launching Activities using `jnigen` + +On the Flutter side, you will need to create Dart bindings for various Android APIs +and call them using Dart code. This will involve setting up `jni`, `jnigen`, +and a configuration file describing the generated output. + +On the Android side, you will need to make some modifications to some Android build +files to account for Compose views and a new `Activity`. + + +## Overview of launching Activities using Method Channels + On the Flutter side, you will need to create a new platform method channel and call its `invokeMethod` method. + On the Android side, you will need to register a matching native `MethodChannel` to receive the signal from Dart and then launch a new activity. Recall that all Flutter apps (when running on Android) exist within @@ -36,7 +52,360 @@ check out [Hosting native Android views][]. Not all Android activities use Jetpack Compose, but this tutorial assumes you want to use Compose. -## On the Dart side +## Launch Activity Using Native Interop (`jnigen`) + +### On the command line + +On the commandline, add `jnigen` as a development dependency +and `jni` as a runtime dependency. `jnigen` will be used to +generate Dart bindings and then when the app is run, `jni` +will execute them. +```sh +flutter pub add jnigen --dev +flutter pub add jni +``` + +### On the Dart side + +In your dart code, create jnigen.dart file specifying the +bindings you will be generating. + +First, run the following command to build the app and make +available the files needed to execute code generation. + +```sh +flutter build apk +``` + + +In a new file `tool\jnigen.dart`, add the following code. + +```dart +import 'dart:io'; + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/android.g.dart'), + structure: OutputStructure.singleFile, + ), + ), + androidSdkConfig: AndroidSdkConfig(addGradleDeps: true), + classes: [ + // provided by Android OS + 'android.os.Bundle', + 'android.content.Intent', + 'android.content.Context' + ], + ), + ); +} +``` + +Execute `dart run tool/jnigen.dart` to generate the Dart bindings. + +With the bindings generated, we can directly + +```dart +import 'package:flutter/material.dart'; +// uses added namespace because some bindings conflict with Dart classes (Intent) +import 'package:android_launch_activity/gen/android.g.dart' as native; +import 'package:jni/jni.dart'; + +// Context.fromReference ensures we get Android Context object +// rather than the default `JObject` +var context = native.Context.fromReference(Jni.androidApplicationContext.reference); + +void main() { + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + // SECTION 2: START COPYING HERE + void _launchAndroidActivity() { + + var intent = native.Intent.new$1(context, native.SecondActivity.type.jClass); + intent.addFlags(native.Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra$18('message'.toJString(), 'Hello from Flutter'.toJString()); + context.startActivity(intent); + + intent.release(); + +} + // SECTION 2: END COPYING HERE + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: const Center(child: Text('Hello World!')), + floatingActionButton: FloatingActionButton( + // SECTION 3: Call `_launchAndroidActivity` somewhere. + onPressed: _launchAndroidActivity, + + // SECTION 3: End + tooltip: 'Launch Android activity', + child: const Icon(Icons.launch), + ), + ), + ); + } +} + +``` + + +### On the Android Side + +You must make changes to 4 files in the generated Android app to +ready it for launching fresh Compose activities. + +The first file requiring modifications is `android/app/build.gradle`. + + 1. Add the following to the existing `android` block: + + + + + ```kotlin title="android/app/build.gradle.kts" + android { + // Begin adding here + buildFeatures { + compose = true + } + composeOptions { + // https://developer.android.com/jetpack/androidx/releases/compose-kotlin + kotlinCompilerExtensionVersion = "1.4.8" + } + // End adding here + } + ``` + + + + + ```groovy title="android/app/build.gradle" + android { + // Begin adding here + buildFeatures { + compose true + } + composeOptions { + // https://developer.android.com/jetpack/androidx/releases/compose-kotlin + kotlinCompilerExtensionVersion = "1.4.8" + } + // End adding here + } + ``` + + + + + Visit the [developer.android.com][] link in the code snippet and + adjust `kotlinCompilerExtensionVersion`, as necessary. + You should only need to do this if you + receive errors during `flutter run` and those errors tell you + which versions are installed on your machine. + + [developer.android.com]: {{site.android-dev}}/jetpack/androidx/releases/compose-kotlin + + 2. Next, add the following block at the bottom of the file, at the root level: + + + + + ```kotlin title="android/app/build.gradle.kts" + dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose") + implementation(platform("androidx.compose:compose-bom:2024.06.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.material3:material3") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2024.06.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") + debugImplementation("androidx.compose.ui:ui-test-manifest") + } + ``` + + + + + ```groovy title="android/app/build.gradle" + dependencies { + implementation("androidx.core:core-ktx:1.10.1") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") + implementation("androidx.activity:activity-compose") + implementation(platform("androidx.compose:compose-bom:2024.06.00")) + implementation("androidx.compose.ui:ui") + implementation("androidx.compose.ui:ui-graphics") + implementation("androidx.compose.ui:ui-tooling-preview") + implementation("androidx.compose.material:material") + implementation("androidx.compose.material3:material3") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) + androidTestImplementation("androidx.compose.ui:ui-test-junit4") + debugImplementation("androidx.compose.ui:ui-tooling") +implementation "androidx.core:core-ktx:1.10.1" +implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" +implementation "androidx.activity:activity-compose" +implementation platform("androidx.compose:compose-bom:2024.06.00") +implementation "androidx.compose.ui:ui" +implementation "androidx.compose.ui:ui-graphics" +implementation "androidx.compose.ui:ui-tooling-preview" +implementation "androidx.compose.material:material" +implementation "androidx.compose.material3:material3" +testImplementation "junit:junit:4.13.2" +androidTestImplementation "androidx.test.ext:junit:1.1.5" +androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" +androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") +androidTestImplementation "androidx.compose.ui:ui-test-junit4" +debugImplementation "androidx.compose.ui:ui-tooling" +debugImplementation "androidx.compose.ui:ui-test-manifest" + } + ``` + + + + + The second file requiring modifications is `android/build.gradle`. + + 1. Add the following buildscript block at the top of the file: + + + + + ```kotlin title="android/build.gradle.kts" + buildscript { + dependencies { + // Replace with the latest version. + classpath("com.android.tools.build:gradle:8.1.1") + } + repositories { + google() + mavenCentral() + } + } + ``` + + + + + ```groovy title="android/build.gradle" + buildscript { + dependencies { + // Replace with the latest version. + classpath 'com.android.tools.build:gradle:8.1.1' + } + repositories { + google() + mavenCentral() + } + } + ``` + + + + + The third file requiring modifications is + `android/app/src/main/AndroidManifest.xml`. + + 1. In the root application block, add the following `` declaration: + + ```xml title="android/app/src/main/AndroidManifest.xml" + + + + // START COPYING HERE + + // END COPYING HERE + + + … + + ``` + + The fourth and final code requiring modifications is + `android/app/src/main/kotlin/com/example/flutter_android_activity/MainActivity.kt`. + Here you'll write Kotlin code for your desired Android functionality. + + 1. Add the necessary imports at the top of the file + :::note + Your imports might vary if library versions have changed or + if you introduce different Compose classes when + you write your own Kotlin code. + Follow your IDE's hints for the correct imports you require. + ::: + + ```dart + package com.example.android_launch_activity + +import android.content.Intent +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.ui.Modifier +import androidx.core.app.ActivityCompat +import io.flutter.embedding.android.FlutterActivity + ``` + + + 1. Add a second `Activity` to the bottom of the file, which you + referenced in the previous changes to `AndroidManifest.xml`: + + ```kotlin title="MainActivity.kt" +class SecondActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + MaterialTheme { + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { + Column { + Text(text = "Second Activity") + // Note: This must match the shape of the data passed from your Dart code. + Text("" + getIntent()?.getExtras()?.getString("message")) + Button(onClick = { finish() }) { + Text("Exit") + } + } + } + } + } + } +} + ``` + + +## Launch Activity using `MethodChannels` + +### On the Dart side On the Dart side, create a method channel and invoke it from a specific user interaction, like tapping a button. @@ -105,7 +474,7 @@ There are 3 important values that must match across your Dart and Kotlin code: In this case, the data is a map with a single `"message"` key. -## On the Android side +### On the Android side You must make changes to 4 files in the generated Android app to ready it for launching fresh Compose activities. diff --git a/src/content/platform-integration/android/jnigen.md b/src/content/platform-integration/android/jnigen.md new file mode 100644 index 00000000000..c39834535b5 --- /dev/null +++ b/src/content/platform-integration/android/jnigen.md @@ -0,0 +1,243 @@ +--- +title: "Calling Native APIs with jnigen" +description: "Use an Android API directly from Flutter code" +--- + +## Overview + +`jnigen` stands for Java Native Interface GENeration. It is a means for +calling native Java and Kotlin (JVM) code from Dart. It builds upon the FFI (Foreign Function Interface) package that C-based languages use. + +## How It Works + +Before we can use a native interop call in an application, we need to do a little setup. + +The APISummarizer is a tool that reads source and bytecode to determine which classes and functions are present. The abstract syntax tree defining the desired classes is read to create Dart versions with modifications to account for the differences between the Java platform and Dart. + +Diagram should go here + + +Node tree + + + +:::warning +There is an alternate method of specifying generation output using a `jnigen.yaml` file. +That method is considered deprecated. +::: + + +### Step 1: Create a new app project + +### Step 2: Add `jni` and `jnigen` as dependencies + +```sh +dart pub add jni +dart pub add jnigen --dev +``` + +To make sure that Android OS APIs and whatever dependencies are available to `jnigen`, run the following to build +an Android apk of the application. + +```sh +flutter build apk +``` + +### Step 3: Set configuration of Dart bindings +There is a Dart API in `jnigen` to specify the properties your generated should have. You will create +a Dart file. `tool\jnigen.dart` is the convention but you can create it anywhere. The file needs at +minimum a single function call to `generateJniBindings` that accepts a `Config` object as a parameter. + +Here is a minimal configuration file. + +```dart +import 'dart:io'; + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/'), + structure: OutputStructure.packageStructure, + ), + ), + classes: [ + // Core Java classes are generally available + // like java.util.ArrayList, etc + + // Android OS classes are also available + // provided `flutter build apk` is run + // before this function + + // 'java.util.ArrayList', + // 'android.widget.Toast', + ], + ), + ); + + +``` + + +The `Config` object is a Dart API for specifying: + +* the location of developer-created source code, +* the final location of the generated Dart code, +* dependencies to download from online repositories, and, +* specifics of the Android version to build against. + +```dart +Config({ + required OutputConfig outputConfig, + required List classes, + Set? experiments, + List? sourcePath, + List? classPath, + String? preamble, + Map? customClassBody, + AndroidSdkConfig? androidSdkConfig, + MavenDownloads? mavenDownloads, + SummarizerOptions? summarizerOptions, + List? nonNullAnnotations, + List? nullableAnnotations, + Level logLevel = Level.INFO, + String? dumpJsonTo, + List? imports, + List? visitors +}) +``` + +Here is the final configuration file to generate Dart bindings to show an Android `Toast` message. + +```dart +import 'dart:io'; + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/android.g.dart'), + structure: OutputStructure.singleFile, + ), + ), + androidSdkConfig: AndroidSdkConfig(addGradleDeps: true), + classes: [ + 'android.widget.Toast', // provided by Android OS + ], + ), + ); +} + +``` + +Finally, run + +```sh +dart tool/jnigen.dart +``` + + +### Step 4: Call Dart bindings + +```dart +// Retrieves an Android context to pass with native calls +JObject context = Jni.androidApplicationContext; + +/// Display DateTime retrieved from Dart +void showToast() { + final message = 'The time is now ${DateTime.now()}'; + +// Corresponds to this second signature +// public static Toast makeText (Context context, +// CharSequence text, +// int duration) +// First one uses R namespace resources + Toast.makeText$1(context, message.toJString(), Toast.LENGTH_LONG)!.show(); +} +``` + +Here is the full `main.dart` file. + +:::note +Java/Kotlin and Dart differ on support of overloaded functions, that's to say functions that use the same +name but differ on return type, parameter type, or number of parameters. + +To compensate for this, when Dart bindings are built, overloaded functions take the form of +`functionName$`. At present, they are parsed in the order that they appear in the files +so there might not be a correlation between number and type of parameters and the eventual Dart identifier. +::: + +```dart + +import 'package:android_toast_demo/gen/android/os/_package.dart'; +import 'package:android_toast_demo/gen/android/widget/_package.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:jni/jni.dart'; + + +JObject context = Jni.androidApplicationContext; + + +/// Display DateTime retrieved from Dart +void showToast() { + final message = 'The time is now ${DateTime.now()}'; + +// Corresponds to this second signature +// public static Toast makeText (Context context, +// CharSequence text, +// int duration) +// First one uses R namespace resources + Toast.makeText$1(context, message.toJString(), Toast.LENGTH_LONG)!.show(); +} + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData(primarySwatch: Colors.teal), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatelessWidget { + const MyHomePage({super.key, required this.title}); + + final String title; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: Text(title)), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + child: const Text('Show Time'), + onPressed: () => showToast(), + ), + ], + ), + ), + ); + } +} + +``` diff --git a/src/content/platform-integration/android/request-permission.md b/src/content/platform-integration/android/request-permission.md new file mode 100644 index 00000000000..02c36f574fe --- /dev/null +++ b/src/content/platform-integration/android/request-permission.md @@ -0,0 +1,195 @@ +--- +title: "Request Android permissions" +description: "Request and manage Android permissions from jni code using a plugin" +--- + +## Overview + +This page details a means to use `jnigen` to wrap native Android code and package that functionality +as a plugin. It demonstrates requesting and querying Android permissions natively from Flutter. + +With this flow, one only has to edit a single file on the Android side. + +The code for [this plugin][] can be found here. + +## How It Works + +### `jnigen` Setup + +```dart + +import 'package:jnigen/jnigen.dart'; + +void main(List args) { + final packageRoot = Platform.script.resolve('../'); + generateJniBindings( + Config( + outputConfig: OutputConfig( + dartConfig: DartCodeOutputConfig( + path: packageRoot.resolve('lib/gen/android.g.dart'), + structure: OutputStructure.singleFile, + ), + ), + androidSdkConfig: AndroidSdkConfig(addGradleDeps: true, androidExample: 'example/'), + classes: [ + // provided by Android OS + 'android.app.Application', + 'androidx.activity.ComponentActivity', + 'androidx.fragment.app.FragmentActivity', + 'androidx.activity.result.ActivityResult', + 'androidx.core.app.ActivityCompat', + 'androidx.activity.result.ActivityResultCallback', + 'androidx.activity.result.ActivityResultLauncher', + 'androidx.activity.result.contract.ActivityResultContract', + 'android.content.Intent', + //'android.content.Context', + 'androidx.core.content.ContextCompat', + 'android.Manifest', + 'android.content.pm.PackageManager' + ], + ), + ); +} + +``` + +### Plugin implementation + +```dart +import 'package:flutter/foundation.dart'; + +import 'permissions_plugin_platform_interface.dart'; +import 'gen/android.g.dart'; +import 'package:jni/jni.dart'; + +class PermissionsPlugin { + Future getPlatformVersion() { + return PermissionsPluginPlatform.instance.getPlatformVersion(); + } + + // + bool checkPermission(JObject context, String permission) { + // Returns a simple true or false if the permission has been granted + var result = ContextCompat.checkSelfPermission( + context, + permission.toJString(), + ); + return result == PackageManager.PERMISSION_GRANTED ? true : false; + } + + int checkAndRequestPermission( + JObject context, + String permission, + Function callback, + ) { + // Do I have permission? + if (ContextCompat.checkSelfPermission(context, permission.toJString()) == + PackageManager.PERMISSION_GRANTED) { + callback(); + } else if (ActivityCompat.shouldShowRequestPermissionRationale( + Jni.androidActivity(PlatformDispatcher.instance.engineId!), + permission.toJString(), + ) == + true) { + // Has the user denied the permission before? + // Give a reason why I need the permission + // and allow a re-request + print("I should ask for permission"); + // TODO Flow to show UI to reshow perms dialog + return -2; + } else { + // Ask for permission + ActivityCompat.requestPermissions( + Jni.androidActivity(PlatformDispatcher.instance.engineId!), + JArray.of(JString.type, [permission.toJString()]), + 0, + ); + } + return 0; + } +} + +``` + +### Using the plugin in an app + +Using this implementation of permissions means you only need to edit one bit of Android code to +add the possible permissions into the app's `AndroidManifest.xml` file. If the permission +does not exist in that file, `checkAndRequestPermission` will fail silently. + +```xml + + + + + + + +``` + +#### Initialize the plugin + +```dart +class _MyAppState extends State { + String _platformVersion = 'Unknown'; + final _permissionsPlugin = PermissionsPlugin(); + + @override + void initState() { + super.initState(); + initPlatformState(); + } + // ... +} +``` + +Here is how the two implemented functions look on the Dart side. + +```dart +// Returns true or false if the permission has been granted +_permissionsPlugin.checkPermission( + Jni.androidApplicationContext, + "android.permission.CAMERA" +); + + +// Check for the permission and run execute a callback if allowed +_permissionsPlugin.checkAndRequestPermission( + Jni.androidApplicationContext, + "android.permission.CAMERA", + () { /* Code to run if the permission was granted */}, + ); + +``` + + + +```dart +@override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text('Plugin example app')), + body: Center( + child: Column( + children: [ + Text('Running on: $_platformVersion\n'), + FilledButton( + child: Text("Request Camera Permissions"), + onPressed: () { +_permissionsPlugin.checkAndRequestPermission( + Jni.androidApplicationContext, + "android.permission.CAMERA", + () {}, + ); + }, + ), + ], + ), + ), + ), + ); + +``` + +[this plugin]: https://github.com/flutter/demos/tree/main/native_interop_demos/permissions_plugin diff --git a/src/content/platform-integration/native-code-options.md b/src/content/platform-integration/native-code-options.md new file mode 100644 index 00000000000..b0b6f4ffcfd --- /dev/null +++ b/src/content/platform-integration/native-code-options.md @@ -0,0 +1,56 @@ +--- +title: Writing custom platform-specific code +shortTitle: Platform-specific code +description: Learn how about the options to call platform specific code in your app. +--- + +## Overview + +You have a number of options to use platform-specific code +in your Dart and Flutter apps from low level options that +require a deep knowledge of Dart and the host language to +high level options that allow you to use a high level API +to abstract some of the native bits away. They are: + +* Direct native interop using FFI or JNI + +This method involves an addtional step to generate code +bindings from the host platform language into Dart. + +* Self-managed platform channels + +This method involves using a plugin that hosts native code +which is executed asynchronously through message passing +from Dart to iOS/Android and back. + +* Type-safe plaform channels via Pigeon + +With regular method channels, one must manage type safety +and object serialization on their own. With Pigeon, the +message contents are managed as well as giving the developer +a level of control over the generated Dart API. It is best +seen as a superset of regular platform channels. + +* Or some combination of the above. + + +## Which should I use? + +There are a lot of considerations that may determine which to +use including familiarity with the language the native OS is +written in, comfort with low-level considerations like memory +management, and the breadth of the underlying API surface you +would like to implement. + +*I need to access a few native-code functions.* + +Use `ffi/jnigen`. Making a discrete plugin for a single function +on a single class would be overkill. + +*I need to implement the same interface on iOS and Android.* + +Use `pigeon`. + +*I need to re-implement a full native API in Dart.* + +Consider `pigeon` augmented by `ffi/jnigen`. diff --git a/src/content/platform-integration/platform-channels.md b/src/content/platform-integration/platform-channels.md index 67e27eac9c7..5c0ee38089c 100644 --- a/src/content/platform-integration/platform-channels.md +++ b/src/content/platform-integration/platform-channels.md @@ -1,7 +1,7 @@ --- -title: Writing custom platform-specific code -shortTitle: Platform-specific code -description: Learn how to write custom platform-specific code in your app. +title: Using message passing to execute platform-specific code +shortTitle: Platform-channel code +description: Learn how to use platform channels in your app. --- diff --git a/src/data/sidenav/default.yml b/src/data/sidenav/default.yml index 9dfc17b4c68..89795661f15 100644 --- a/src/data/sidenav/default.yml +++ b/src/data/sidenav/default.yml @@ -365,9 +365,11 @@ permalink: /reference/supported-platforms - title: Build desktop apps with Flutter permalink: /platform-integration/desktop - - title: Write platform-specific code + - title: Write platform-specific code (new) + permalink: /platform-integration/native-code-options + - title: Communicate with the host OS (old pigeon/platform channels topic) permalink: /platform-integration/platform-channels - - title: Bind to native code + - title: Bind to native code using ffi (title change) permalink: /platform-integration/bind-native-code - title: Android permalink: /platform-integration/android @@ -380,10 +382,14 @@ permalink: /platform-integration/android/predictive-back - title: Host a native Android view permalink: /platform-integration/android/platform-views - - title: Calling JetPack APIs - permalink: /platform-integration/android/call-jetpack-apis - - title: Launch a Jetpack Compose activity + - title: Call native APIs (delete) + permalink: /platform-integration/android/call-native-apis + - title: Use jnigen to call Android code (new) + permalink: /platform-integration/android/jnigen + - title: Launch a Jetpack Compose activity (updated) permalink: /platform-integration/android/compose-activity + - title: Request Android permissions from Flutter (new) + permalink: /platform-integration/android/request-permission - title: Restore state on Android permalink: /platform-integration/android/restore-state-android - title: Target ChromeOS with Android @@ -910,4 +916,4 @@ - title: flutter CLI permalink: /reference/flutter-cli - title: API docs - permalink: https://api.flutter.dev \ No newline at end of file + permalink: https://api.flutter.dev From 5b2dd833669e23b4045cb2a8343ee7a763fe7b6a Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:02:39 -0800 Subject: [PATCH 02/16] Update compose-activity.md --- src/content/platform-integration/android/compose-activity.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index 5d23ffd1f4c..041821986b3 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -27,6 +27,9 @@ and a configuration file describing the generated output. On the Android side, you will need to make some modifications to some Android build files to account for Compose views and a new `Activity`. +The [code][] for this version is available on Github. + +[code]:https://github.com/flutter/demos/tree/main/native_interop_demos/android_launch_activity ## Overview of launching Activities using Method Channels From 158cd1ab6405ddf36dc47c7d56163e272e6a6d6e Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:12:42 -0800 Subject: [PATCH 03/16] Update src/content/platform-integration/android/compose-activity.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/android/compose-activity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index 041821986b3..a4617b4d9cb 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -81,7 +81,7 @@ flutter build apk ``` -In a new file `tool\jnigen.dart`, add the following code. +In a new file `tool/jnigen.dart`, add the following code. ```dart import 'dart:io'; From e97fcb8d7d51da201e03e4b600ce6a808eb97f19 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:13:41 -0800 Subject: [PATCH 04/16] Update src/content/platform-integration/android/compose-activity.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/android/compose-activity.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/compose-activity.md b/src/content/platform-integration/android/compose-activity.md index a4617b4d9cb..891fdc7006a 100644 --- a/src/content/platform-integration/android/compose-activity.md +++ b/src/content/platform-integration/android/compose-activity.md @@ -360,7 +360,7 @@ debugImplementation "androidx.compose.ui:ui-test-manifest" Follow your IDE's hints for the correct imports you require. ::: - ```dart +```kotlin package com.example.android_launch_activity import android.content.Intent From 43a288fd8d7b64f406c035c146e08e8a38584e7c Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:14:50 -0800 Subject: [PATCH 05/16] Clean up jnigen.md by removing unused content Removed placeholder for diagram and extra line breaks. --- src/content/platform-integration/android/jnigen.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/content/platform-integration/android/jnigen.md b/src/content/platform-integration/android/jnigen.md index c39834535b5..8d097000769 100644 --- a/src/content/platform-integration/android/jnigen.md +++ b/src/content/platform-integration/android/jnigen.md @@ -14,8 +14,6 @@ Before we can use a native interop call in an application, we need to do a littl The APISummarizer is a tool that reads source and bytecode to determine which classes and functions are present. The abstract syntax tree defining the desired classes is read to create Dart versions with modifications to account for the differences between the Java platform and Dart. -Diagram should go here - Node tree @@ -82,7 +80,6 @@ void main(List args) { ``` - The `Config` object is a Dart API for specifying: * the location of developer-created source code, From bc7d973e5a6907da40c6db0b7d1ee8f629a890d0 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:15:43 -0800 Subject: [PATCH 06/16] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/android/jnigen.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/android/jnigen.md b/src/content/platform-integration/android/jnigen.md index 8d097000769..1e08e4addce 100644 --- a/src/content/platform-integration/android/jnigen.md +++ b/src/content/platform-integration/android/jnigen.md @@ -43,7 +43,7 @@ flutter build apk ### Step 3: Set configuration of Dart bindings There is a Dart API in `jnigen` to specify the properties your generated should have. You will create -a Dart file. `tool\jnigen.dart` is the convention but you can create it anywhere. The file needs at +a Dart file. `tool/jnigen.dart` is the convention but you can create it anywhere. The file needs at minimum a single function call to `generateJniBindings` that accepts a `Config` object as a parameter. Here is a minimal configuration file. From d219e5017d415499f71a369dc362523ece3551b8 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:16:18 -0800 Subject: [PATCH 07/16] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/native-code-options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/native-code-options.md b/src/content/platform-integration/native-code-options.md index b0b6f4ffcfd..64782c99457 100644 --- a/src/content/platform-integration/native-code-options.md +++ b/src/content/platform-integration/native-code-options.md @@ -14,7 +14,7 @@ to abstract some of the native bits away. They are: * Direct native interop using FFI or JNI -This method involves an addtional step to generate code +This method involves an additional step to generate code bindings from the host platform language into Dart. * Self-managed platform channels From 61c5f44ae031fab3853062de1994afe9682528b6 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:17:00 -0800 Subject: [PATCH 08/16] Apply suggestions from code review Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/content/platform-integration/native-code-options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/platform-integration/native-code-options.md b/src/content/platform-integration/native-code-options.md index 64782c99457..78a1dff4850 100644 --- a/src/content/platform-integration/native-code-options.md +++ b/src/content/platform-integration/native-code-options.md @@ -23,7 +23,7 @@ This method involves using a plugin that hosts native code which is executed asynchronously through message passing from Dart to iOS/Android and back. -* Type-safe plaform channels via Pigeon +* Type-safe platform channels via Pigeon With regular method channels, one must manage type safety and object serialization on their own. With Pigeon, the From ecc232901dd3544cf0bd9ffc4552a4d91e28fa6e Mon Sep 17 00:00:00 2001 From: lamek Date: Fri, 12 Jun 2026 20:50:27 +0000 Subject: [PATCH 09/16] docs: restructure native interop options and modernize jnigen tutorial with assets --- .../android/call-native-apis.md | 97 ++---- .../platform-integration/android/jnigen.md | 297 ++++++++---------- .../native-code-options.md | 92 ++++-- .../web/assets/images/android/jnigen-flow.svg | 60 ++++ .../assets/images/android/jnigen-success.png | Bin 0 -> 90133 bytes 5 files changed, 277 insertions(+), 269 deletions(-) create mode 100644 sites/docs/web/assets/images/android/jnigen-flow.svg create mode 100644 sites/docs/web/assets/images/android/jnigen-success.png diff --git a/sites/docs/src/content/platform-integration/android/call-native-apis.md b/sites/docs/src/content/platform-integration/android/call-native-apis.md index d29f800ed37..8ec36b0d634 100644 --- a/sites/docs/src/content/platform-integration/android/call-native-apis.md +++ b/sites/docs/src/content/platform-integration/android/call-native-apis.md @@ -1,91 +1,30 @@ --- -title: "Calling Native APIs" -description: "Use an Android API directly from Flutter code" +title: "Calling Android APIs" +description: "How to call Android-specific APIs or native libraries from Flutter code." --- Flutter apps running on Android can always make use of the -latest APIs on the first day they are released on Android, no -matter what. This page outlines available ways to invoke -Android-specific APIs. +latest APIs on the first day they are released on Android, +no matter what. -## Use an existing solution +To choose the best integration model for your app, +first review the [Platform-specific options guide](/platform-integration/native-code-options). -In most scenarios, you can use a plugin (as shown in the next section) -to invoke native APIs without writing any custom boilerplate or -glue code yourself. +## Native Android integrations -### Use a plugin +Once you have selected an integration architecture, +use the following resources to implement it on Android: -Using a plugin is often the easiest way to access native -APIs, regardless of where your Flutter app is running. To -use plugins, visit [pub.dev][pub] and search for -the topic you need. Most native features, including accessing -common hardware like GPS, the camera, or step counters are -supported by robust plugins. +### Call Java or Kotlin code directly +To invoke standard Android APIs, Jetpack libraries, or custom JVM classes: +* Read our guide on using [jnigen to bind Java/Kotlin code](/platform-integration/android/jnigen). -For complete guidance on adding plugins to your Flutter app, -see the [Using packages documentation][packages]. +### Call C or C++ NDK libraries directly +To execute low-level C libraries or native engine code: +* Read our guide on using [Dart FFI](/platform-integration/bind-native-code). -[packages]: /packages-and-plugins/using-packages -[pub]: {{site.pub}} - -Not all native features are supported by plugins, especially -immediately after their release. In any scenario where -your desired native feature is not covered by a package on -[pub.dev][pub], continue on to the following sections. - -## Creating a custom solution - -Not all scenarios and APIs will be supported by -existing solutions; but luckily, you can always add whatever -support you need. The next sections describe two different -ways to call native code from Dart. - -:::note -Neither solution below is inherently better or worse than -existing plugins, because all plugins use one of the following -two options. -::: - -### Call native code directly via FFI - -The most direct and efficient way to invoke native APIs is by -calling the API directly, via FFI. This links your Dart executable -to any specified native code at compile-time, allowing you to -call it directly from the UI thread through a small amount of glue -code. In most cases, [ffigen][ffigen] or [jnigen][jnigen] are -helpful in writing this glue code. - -For complete guidance on directly calling native code from -your Flutter app, see the [FFI documentation][ffi]. - -In the coming months, the Dart team hopes to make this process -easier with direct support for calling native APIs using the -FFI approach, but without any need for the developer to write -glue code. - -[ffi]: {{site.dart-site}}/interop/c-interop -[ffigen]: {{site.pub}}/packages/ffigen -[jnigen]: {{site.pub}}/packages/jnigen - - -### Add a MethodChannel - -[`MethodChannel`][methodchannels-api-docs]s are an alternate -way Flutter apps can invoke arbitrary native code. -Unlike the FFI solution described in the previous step, -MethodChannels are always asynchronous, which -might or might not matter to you, depending on your use case. As -with FFI and direct calls to native code, using a `MethodChannel` -requires a small amount of glue code to translate your Dart objects -into native objects, and then back again. In most cases, -[`pkg:pigeon`][pigeon] is helpful in writing this glue code. - -For complete guidance on adding MethodChannels to your Flutter -app, see the [`MethodChannel`s documentation][methodchannels]. - -[methodchannels]: /platform-integration/platform-channels -[methodchannels-api-docs]: {{site.api}}/flutter/services/MethodChannel-class.html -[pigeon]: {{site.pub}}/packages/pigeon +### Communicate using a message bridge +To build plugins or communicate asynchronously with platform-specific code: +* Use [Pigeon or manual MethodChannels](/platform-integration/platform-channels). diff --git a/sites/docs/src/content/platform-integration/android/jnigen.md b/sites/docs/src/content/platform-integration/android/jnigen.md index 1e08e4addce..90a8e982bff 100644 --- a/sites/docs/src/content/platform-integration/android/jnigen.md +++ b/sites/docs/src/content/platform-integration/android/jnigen.md @@ -1,200 +1,176 @@ --- -title: "Calling Native APIs with jnigen" -description: "Use an Android API directly from Flutter code" +title: "Calling Android APIs using jnigen" +description: "Learn how to use auto-generated Dart bindings to call native Android APIs directly from your Flutter plugins." --- ## Overview -`jnigen` stands for Java Native Interface GENeration. It is a means for -calling native Java and Kotlin (JVM) code from Dart. It builds upon the FFI (Foreign Function Interface) package that C-based languages use. +In traditional Flutter development, +calling native Android platform APIs requires mapping asynchronous message channels +(using `MethodChannel` or `BasicMessageChannel`), +writing Kotlin or Java host-side listeners, +and manually serializing and deserializing types. -## How It Works +With direct native interop using `jnigen` (Java Native Interface Generation), +this process is simplified: +1. **Configure**: Write a generation configuration script + pointing to the Android SDK or third-party classes you need. +2. **Generate**: Run the generation package + to analyze native classes and compile a type-safe Dart API bridge. +3. **Call directly**: Call Java/Kotlin code synchronously (where applicable) + and type-safely in your Dart code. -Before we can use a native interop call in an application, we need to do a little setup. +![jnigen tooling flow chart](/assets/images/android/jnigen-flow.svg){:width="100%"} -The APISummarizer is a tool that reads source and bytecode to determine which classes and functions are present. The abstract syntax tree defining the desired classes is read to create Dart versions with modifications to account for the differences between the Java platform and Dart. - - -Node tree - - - -:::warning -There is an alternate method of specifying generation output using a `jnigen.yaml` file. -That method is considered deprecated. -::: +This tutorial guides you through building a Flutter plugin called `native_toast` +that interacts directly with Android's system `Toast` messages +without manually writing any Kotlin code. +--- -### Step 1: Create a new app project +## Step 1: Create a plugin and add dependencies -### Step 2: Add `jni` and `jnigen` as dependencies +First, create a new Flutter plugin template focused on the Android platform. ```sh -dart pub add jni -dart pub add jnigen --dev +flutter create --template=plugin --platforms=android native_toast +cd native_toast ``` -To make sure that Android OS APIs and whatever dependencies are available to `jnigen`, run the following to build -an Android apk of the application. +Now, add the mandatory runtime bindings package (`jni`), +the Flutter hooks integration wrapper (`jni_flutter`), +and the developer-facing generator tool (`jnigen`) as a dev dependency: ```sh -flutter build apk +flutter pub add jni jni_flutter +flutter pub add dev:jnigen ``` -### Step 3: Set configuration of Dart bindings -There is a Dart API in `jnigen` to specify the properties your generated should have. You will create -a Dart file. `tool/jnigen.dart` is the convention but you can create it anywhere. The file needs at -minimum a single function call to `generateJniBindings` that accepts a `Config` object as a parameter. - -Here is a minimal configuration file. - -```dart -import 'dart:io'; - -import 'package:jnigen/jnigen.dart'; - -void main(List args) { - final packageRoot = Platform.script.resolve('../'); - generateJniBindings( - Config( - outputConfig: OutputConfig( - dartConfig: DartCodeOutputConfig( - path: packageRoot.resolve('lib/gen/'), - structure: OutputStructure.packageStructure, - ), - ), - classes: [ - // Core Java classes are generally available - // like java.util.ArrayList, etc - - // Android OS classes are also available - // provided `flutter build apk` is run - // before this function - - // 'java.util.ArrayList', - // 'android.widget.Toast', - ], - ), - ); - +--- -``` +## Step 2: Create the generation config script -The `Config` object is a Dart API for specifying: +Create a configuration script that details which native classes `jnigen` +needs to generate Dart models for. -* the location of developer-created source code, -* the final location of the generated Dart code, -* dependencies to download from online repositories, and, -* specifics of the Android version to build against. +Specify `tool/jnigen.dart` at the root of your plugin directory: -```dart -Config({ - required OutputConfig outputConfig, - required List classes, - Set? experiments, - List? sourcePath, - List? classPath, - String? preamble, - Map? customClassBody, - AndroidSdkConfig? androidSdkConfig, - MavenDownloads? mavenDownloads, - SummarizerOptions? summarizerOptions, - List? nonNullAnnotations, - List? nullableAnnotations, - Level logLevel = Level.INFO, - String? dumpJsonTo, - List? imports, - List? visitors -}) +```sh +mkdir -p tool +touch tool/jnigen.dart ``` -Here is the final configuration file to generate Dart bindings to show an Android `Toast` message. +Add the following configuration code to `tool/jnigen.dart`: ```dart import 'dart:io'; - import 'package:jnigen/jnigen.dart'; void main(List args) { final packageRoot = Platform.script.resolve('../'); + generateJniBindings( Config( outputConfig: OutputConfig( dartConfig: DartCodeOutputConfig( - path: packageRoot.resolve('lib/gen/android.g.dart'), + path: packageRoot.resolve('lib/src/generated/android_os.g.dart'), structure: OutputStructure.singleFile, ), ), - androidSdkConfig: AndroidSdkConfig(addGradleDeps: true), + // Automatically resolves your Android SDK path and evaluates the + // example app's build setup to acquire required platform dependencies. + androidSdkConfig: AndroidSdkConfig( + addGradleDeps: true, + androidExample: 'example/', + ), classes: [ - 'android.widget.Toast', // provided by Android OS + 'android.widget.Toast', + 'android.os.Vibrator', + 'android.content.Context', ], ), ); } - ``` +--- -Finally, run +## Step 3: Run the code generator + +Run the code generation script to compile your bindings: ```sh -dart tool/jnigen.dart +dart run tool/jnigen.dart ``` +Once execution completes, +`jnigen` creates a type-safe bridge inside `lib/src/generated/android_os.g.dart`. + +--- + +## Step 4: Implement the user-facing plugin API -### Step 4: Call Dart bindings +Now, build a clean, developer-facing API +that imports the generated interop bindings +and abstracts away the JNI details. + +Replace the contents of `lib/native_toast.dart` with the following implementation: ```dart -// Retrieves an Android context to pass with native calls -JObject context = Jni.androidApplicationContext; - -/// Display DateTime retrieved from Dart -void showToast() { - final message = 'The time is now ${DateTime.now()}'; - -// Corresponds to this second signature -// public static Toast makeText (Context context, -// CharSequence text, -// int duration) -// First one uses R namespace resources - Toast.makeText$1(context, message.toJString(), Toast.LENGTH_LONG)!.show(); +import 'package:jni/jni.dart'; +import 'package:jni_flutter/jni_flutter.dart'; +import 'src/generated/android_os.g.dart' as native; + +class NativeToast { + // Extracts the live Android OS context handle and casts it to our generated class + final native.Context _context = androidApplicationContext.as(native.Context.type); + + void showToast(String message) { + // 1. Convert the Dart String into a native Java JString reference pointer + final jMessage = message.toJString(); + + // 2. Call the overloaded constructor generated by jnigen + final toast = native.Toast.makeText$1( + _context, + jMessage, + native.Toast.LENGTH_SHORT, + ); + + // 3. Trigger the standard Android System layout service + toast!.show(); + + // 4. Release the native JNI allocation pointer to prevent memory leaks + jMessage.release(); + } } ``` -Here is the full `main.dart` file. +### Understanding overloaded method mappings -:::note -Java/Kotlin and Dart differ on support of overloaded functions, that's to say functions that use the same -name but differ on return type, parameter type, or number of parameters. +Java and Kotlin support method overloading (methods with the same name +that differ by parameter count or types). +Since Dart does not support method overloading, +`jnigen` appends a dollar suffix (such as `$1` or `$2`) +to disambiguate the generated Dart signatures in the order they are resolved. -To compensate for this, when Dart bindings are built, overloaded functions take the form of -`functionName$`. At present, they are parsed in the order that they appear in the files -so there might not be a correlation between number and type of parameters and the eventual Dart identifier. -::: - -```dart +For example, `Toast.makeText` has two distinct signatures in Android: +* `Toast.makeText(Context context, int resId, int duration)` +* `Toast.makeText(Context context, CharSequence text, int duration)` -import 'package:android_toast_demo/gen/android/os/_package.dart'; -import 'package:android_toast_demo/gen/android/widget/_package.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:jni/jni.dart'; +In Dart, these are mapped respectively to: +* `Toast.makeText(...)` (Default / first signature) +* `Toast.makeText$1(...)` (Second signature, which accepts a string-mapped `CharSequence`) +--- -JObject context = Jni.androidApplicationContext; +## Step 5: Test in the example app +Verify the plugin within the automatically generated sandbox project under `example/`. -/// Display DateTime retrieved from Dart -void showToast() { - final message = 'The time is now ${DateTime.now()}'; +Replace the contents of `example/lib/main.dart` with: -// Corresponds to this second signature -// public static Toast makeText (Context context, -// CharSequence text, -// int duration) -// First one uses R namespace resources - Toast.makeText$1(context, message.toJString(), Toast.LENGTH_LONG)!.show(); -} +```dart +import 'package:flutter/material.dart'; +import 'package:native_toast/native_toast.dart'; void main() { runApp(const MyApp()); @@ -206,35 +182,40 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( - title: 'Flutter Demo', - theme: ThemeData(primarySwatch: Colors.teal), - home: const MyHomePage(title: 'Flutter Demo Home Page'), - ); - } -} - -class MyHomePage extends StatelessWidget { - const MyHomePage({super.key, required this.title}); - - final String title; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar(title: Text(title)), - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - ElevatedButton( - child: const Text('Show Time'), - onPressed: () => showToast(), - ), - ], + home: Scaffold( + appBar: AppBar( + title: const Text('Modern Native Toast Demo'), + backgroundColor: Colors.teal, + ), + body: Center( + child: ElevatedButton( + style: ElevatedButton.styleFrom(backgroundColor: Colors.teal), + onPressed: () { + // Instantiate our type-safe plugin wrapper class + final toastPlugin = NativeToast(); + + // Call the direct Android API wrapper + toastPlugin.showToast('Hello from Dart JNI Extension Types!'); + }, + child: const Text('Trigger Native Toast', style: TextStyle(color: Colors.white)), + ), ), ), ); } } +``` +Connect an Android emulator or device, +change into the example folder, +and run: + +```sh +cd example +flutter run ``` + +Once the application launches, +tap **Trigger Native Toast** to verify the system toast display: + +![JNI Toast Success Screenshot](/assets/images/android/jnigen-success.png){:width="300px" style="display: block; margin: 0 auto;"} diff --git a/sites/docs/src/content/platform-integration/native-code-options.md b/sites/docs/src/content/platform-integration/native-code-options.md index 78a1dff4850..d926d63e953 100644 --- a/sites/docs/src/content/platform-integration/native-code-options.md +++ b/sites/docs/src/content/platform-integration/native-code-options.md @@ -6,51 +6,79 @@ description: Learn how about the options to call platform specific code in your ## Overview -You have a number of options to use platform-specific code -in your Dart and Flutter apps from low level options that -require a deep knowledge of Dart and the host language to -high level options that allow you to use a high level API -to abstract some of the native bits away. They are: +Flutter and Dart provide multiple options for using platform-specific code +to access system APIs or leverage existing native SDKs. +These options range from low-level direct interop +requiring knowledge of Dart and the host language, +to high-level messaging paradigms +that abstract the details of the host platform. -* Direct native interop using FFI or JNI +## Plugins -This method involves an additional step to generate code -bindings from the host platform language into Dart. +We recommend checking [pub.dev](https://pub.dev) first +to see if a package or plugin already exists. +Using an existing plugin saves time, effort, and boilerplate. +If no plugin exists, +you can build a custom solution using one of the following approaches. -* Self-managed platform channels +## Custom solutions -This method involves using a plugin that hosts native code -which is executed asynchronously through message passing -from Dart to iOS/Android and back. +If a package does not support your desired feature on pub.dev, +or if you have custom integration requirements, +you can write platform-specific code. -* Type-safe platform channels via Pigeon +Dart and Flutter support two primary architectures for custom integrations. -With regular method channels, one must manage type safety -and object serialization on their own. With Pigeon, the -message contents are managed as well as giving the developer -a level of control over the generated Dart API. It is best -seen as a superset of regular platform channels. +:::note +Neither solution below is inherently better or worse than existing plugins, +because all plugins use one of the following two options. +::: -* Or some combination of the above. +### Direct native interop (FFI or JNI) +Direct native interop executes synchronously directly in memory. +This approach compiles the binding into your Dart executable +and executes native code on the UI thread. -## Which should I use? +To create compilation bindings automatically, +use generator tools like [`ffigen`](https://pub.dev/packages/ffigen) +(for C, Objective-C, and Swift) +or [`jnigen`](https://pub.dev/packages/jnigen) (for Java and Kotlin on Android). -There are a lot of considerations that may determine which to -use including familiarity with the language the native OS is -written in, comfort with low-level considerations like memory -management, and the breadth of the underlying API surface you -would like to implement. +For advanced or custom cases where automated generators do not fit, +you can write manual binding code using `dart:ffi`. -*I need to access a few native-code functions.* +### Method channels -Use `ffi/jnigen`. Making a discrete plugin for a single function -on a single class would be overkill. +Message passing uses asynchronous communication +that serializes data across a platform bridge. -*I need to implement the same interface on iOS and Android.* +We recommend using [`pigeon`](https://pub.dev/packages/pigeon) +to generate structured, type-safe channel code +and handle serialization automatically. -Use `pigeon`. +If Pigeon does not support your use case, +you can write manual `MethodChannel` code +to serialize and pass data yourself. -*I need to re-implement a full native API in Dart.* +--- + +## Choose an approach + +Selecting an approach depends on your familiarity with the host languages, +comfort with low-level details (like memory management), +and the layout of the API you want to cover. + +### I need to access a few native-code functions + +Use **direct native interop** (`ffigen` or `jnigen`). +Creating a complete plugin wrapper for a few discrete functions +introduces unnecessary overhead. + +### I need to implement the same interface on iOS and Android + +Use **type-safe platform channels** with `pigeon`. + +### I need to re-implement a full native API in Dart -Consider `pigeon` augmented by `ffi/jnigen`. +Consider using **Pigeon** augmented by **`ffigen`/`jnigen`**. diff --git a/sites/docs/web/assets/images/android/jnigen-flow.svg b/sites/docs/web/assets/images/android/jnigen-flow.svg new file mode 100644 index 00000000000..ba1f7ed3685 --- /dev/null +++ b/sites/docs/web/assets/images/android/jnigen-flow.svg @@ -0,0 +1,60 @@ + + + + + + Android SDK + or Native JAR/AAR + + + + + ApiSummarizer + + + + jnigen AST parser + Analyzes class layouts + + + + + Generate + + + + android_os.g.dart + Generated Dart Bindings + + + + + Type-safe Imports + + + + Flutter Plugin API + + + + + Calls + + + + Flutter App UI + diff --git a/sites/docs/web/assets/images/android/jnigen-success.png b/sites/docs/web/assets/images/android/jnigen-success.png new file mode 100644 index 0000000000000000000000000000000000000000..fb541a3f1b7c531751193ef2c644e3b8b2b5b08c GIT binary patch literal 90133 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 z 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 JsqEXJ{|9R{fN=l- literal 0 HcmV?d00001 From 3246afbc4e1079c00c1e1c3b8a55e5995cbc9b39 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 18:09:13 -0700 Subject: [PATCH 10/16] Apply suggestion from @gemini-code-assist[bot] Remove duplicated dependencies block Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../android/compose-activity.md | 47 +++++++------------ 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/sites/docs/src/content/platform-integration/android/compose-activity.md b/sites/docs/src/content/platform-integration/android/compose-activity.md index 473d49d9a28..688cab7f0e0 100644 --- a/sites/docs/src/content/platform-integration/android/compose-activity.md +++ b/sites/docs/src/content/platform-integration/android/compose-activity.md @@ -251,37 +251,22 @@ The first file requiring modifications is `android/app/build.gradle`. ```groovy title="android/app/build.gradle" dependencies { - implementation("androidx.core:core-ktx:1.10.1") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.1") - implementation("androidx.activity:activity-compose") - implementation(platform("androidx.compose:compose-bom:2024.06.00")) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material:material") - implementation("androidx.compose.material3:material3") - testImplementation("junit:junit:4.13.2") - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation(platform("androidx.compose:compose-bom:2023.08.00")) - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - debugImplementation("androidx.compose.ui:ui-tooling") -implementation "androidx.core:core-ktx:1.10.1" -implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" -implementation "androidx.activity:activity-compose" -implementation platform("androidx.compose:compose-bom:2024.06.00") -implementation "androidx.compose.ui:ui" -implementation "androidx.compose.ui:ui-graphics" -implementation "androidx.compose.ui:ui-tooling-preview" -implementation "androidx.compose.material:material" -implementation "androidx.compose.material3:material3" -testImplementation "junit:junit:4.13.2" -androidTestImplementation "androidx.test.ext:junit:1.1.5" -androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" -androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") -androidTestImplementation "androidx.compose.ui:ui-test-junit4" -debugImplementation "androidx.compose.ui:ui-tooling" -debugImplementation "androidx.compose.ui:ui-test-manifest" + implementation "androidx.core:core-ktx:1.10.1" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" + implementation "androidx.activity:activity-compose" + implementation platform("androidx.compose:compose-bom:2024.06.00") + implementation "androidx.compose.ui:ui" + implementation "androidx.compose.ui:ui-graphics" + implementation "androidx.compose.ui:ui-tooling-preview" + implementation "androidx.compose.material:material" + implementation "androidx.compose.material3:material3" + testImplementation "junit:junit:4.13.2" + androidTestImplementation "androidx.test.ext:junit:1.1.5" + androidTestImplementation "androidx.test.espresso:espresso-core:3.5.1" + androidTestImplementation platform("androidx.compose:compose-bom:2023.08.00") + androidTestImplementation "androidx.compose.ui:ui-test-junit4" + debugImplementation "androidx.compose.ui:ui-tooling" + debugImplementation "androidx.compose.ui:ui-test-manifest" } ``` From 7450cb81de814a1bb6008ffbb1130a3a08479647 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 18:09:45 -0700 Subject: [PATCH 11/16] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../android/request-permission.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sites/docs/src/content/platform-integration/android/request-permission.md b/sites/docs/src/content/platform-integration/android/request-permission.md index 02c36f574fe..a06856f375b 100644 --- a/sites/docs/src/content/platform-integration/android/request-permission.md +++ b/sites/docs/src/content/platform-integration/android/request-permission.md @@ -69,12 +69,16 @@ class PermissionsPlugin { // bool checkPermission(JObject context, String permission) { - // Returns a simple true or false if the permission has been granted - var result = ContextCompat.checkSelfPermission( - context, - permission.toJString(), - ); - return result == PackageManager.PERMISSION_GRANTED ? true : false; + final jPermission = permission.toJString(); + try { + final result = ContextCompat.checkSelfPermission( + context, + jPermission, + ); + return result == PackageManager.PERMISSION_GRANTED; + } finally { + jPermission.release(); + } } int checkAndRequestPermission( From c5a63b6b13d708dc6791360b3594a5921762b180 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 18:10:46 -0700 Subject: [PATCH 12/16] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../content/platform-integration/android/request-permission.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sites/docs/src/content/platform-integration/android/request-permission.md b/sites/docs/src/content/platform-integration/android/request-permission.md index a06856f375b..64956ef35ad 100644 --- a/sites/docs/src/content/platform-integration/android/request-permission.md +++ b/sites/docs/src/content/platform-integration/android/request-permission.md @@ -193,7 +193,8 @@ _permissionsPlugin.checkAndRequestPermission( ), ), ); - + } +} ``` [this plugin]: https://github.com/flutter/demos/tree/main/native_interop_demos/permissions_plugin From 7a10d8643f467b1c980bff6569177937cb25251d Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 18:57:01 -0700 Subject: [PATCH 13/16] Update index.md Fixed link that was preventing dash_site from checking the links. --- sites/docs/src/content/platform-integration/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sites/docs/src/content/platform-integration/index.md b/sites/docs/src/content/platform-integration/index.md index 712d0384a68..31712a00f4b 100644 --- a/sites/docs/src/content/platform-integration/index.md +++ b/sites/docs/src/content/platform-integration/index.md @@ -133,9 +133,9 @@ Learn how to add custom integrations with Android to your Flutter app.

Learn how to add the predictive back gesture to your app on Android.

- +
- Call JetPack APIs + Call Android APIs

Learn how the latest Android APIs in your app from Dart.

From 11a4af2943143975fc8d19fa099f4eecd6d63ae5 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 19:28:58 -0700 Subject: [PATCH 14/16] Update firebase.json Added redirect for the "call-jetpack-apis" page to "jnigen" and verified with check links. --- firebase.json | 1 + 1 file changed, 1 insertion(+) diff --git a/firebase.json b/firebase.json index 1dd4a98080b..023dd6f3c5c 100644 --- a/firebase.json +++ b/firebase.json @@ -173,6 +173,7 @@ { "source": "/packages-and-plugins/plugin-api-migration", "destination": "/release/breaking-changes/plugin-api-migration", "type": 301 }, { "source": "/platform-integration/android/androidx-migration", "destination": "/release/breaking-changes/androidx-migration", "type": 301 }, { "source": "/platform-integration/android/c-interop", "destination": "/platform-integration/legacy-ffi-plugin", "type": 301 }, + { "source": "/platform-integration/android/call-jetpack-apis", "destination": "/platform-integration/android/jnigen"}, { "source": "/platform-integration/android/install-android", "destination": "/platform-integration/android/setup", "type": 301 }, { "source": "/platform-integration/android/install-android/:rest*", "destination": "/platform-integration/android/setup", "type": 301 }, { "source": "/platform-integration/android/splash-screen-migration", "destination": "/release/breaking-changes/splash-screen-migration", "type": 301 }, From 6799959f4df2c7b8316b23b493db577b16beabe6 Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:16:59 -0700 Subject: [PATCH 15/16] Update firebase.json --- firebase.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firebase.json b/firebase.json index 023dd6f3c5c..c343ccc4285 100644 --- a/firebase.json +++ b/firebase.json @@ -173,7 +173,7 @@ { "source": "/packages-and-plugins/plugin-api-migration", "destination": "/release/breaking-changes/plugin-api-migration", "type": 301 }, { "source": "/platform-integration/android/androidx-migration", "destination": "/release/breaking-changes/androidx-migration", "type": 301 }, { "source": "/platform-integration/android/c-interop", "destination": "/platform-integration/legacy-ffi-plugin", "type": 301 }, - { "source": "/platform-integration/android/call-jetpack-apis", "destination": "/platform-integration/android/jnigen"}, + { "source": "/platform-integration/android/call-jetpack-apis", "destination": "/platform-integration/android/jnigen", "type": 301}, { "source": "/platform-integration/android/install-android", "destination": "/platform-integration/android/setup", "type": 301 }, { "source": "/platform-integration/android/install-android/:rest*", "destination": "/platform-integration/android/setup", "type": 301 }, { "source": "/platform-integration/android/splash-screen-migration", "destination": "/release/breaking-changes/splash-screen-migration", "type": 301 }, From 52f63adf9224fa7bb8a2eb83b7f5a91491b945dd Mon Sep 17 00:00:00 2001 From: James Williams <66931+jwill@users.noreply.github.com> Date: Fri, 12 Jun 2026 22:52:01 -0700 Subject: [PATCH 16/16] Add a draft of an ios demo at /platform-integration/ios/ffigen It is based on the ios calendar demo in flutter/demos --- .../platform-integration/ios/ffigen.md | 434 ++++++++++++++++++ sites/docs/src/data/sidenav/default.yml | 2 + 2 files changed, 436 insertions(+) create mode 100644 sites/docs/src/content/platform-integration/ios/ffigen.md diff --git a/sites/docs/src/content/platform-integration/ios/ffigen.md b/sites/docs/src/content/platform-integration/ios/ffigen.md new file mode 100644 index 00000000000..4a882196d10 --- /dev/null +++ b/sites/docs/src/content/platform-integration/ios/ffigen.md @@ -0,0 +1,434 @@ +--- +title: "Calling iOS APIs using ffigen" +description: "Learn how to use auto-generated Dart bindings to call native Objective-C iOS APIs directly from your Flutter apps." +--- + +## Overview + +In traditional Flutter development, calling native iOS platform APIs requires mapping asynchronous message channels (using `MethodChannel`), writing Swift or Objective-C host-side listeners, and manually serializing and deserializing types. + +With direct native interop using `ffigen` (Foreign Function Interface Generation), this process is simplified: +1. **Configure**: Write a generation configuration script pointing to the iOS Frameworks or headers you need. +2. **Generate**: Run the generation package to analyze native Objective-C classes and compile a type-safe Dart API bridge. +3. **Call directly**: Call Objective-C code synchronously and type-safely in your Dart code. + +This tutorial guides you through building a Flutter app called `ios_calendar_demo` that interacts directly with iOS's system `EventKit` framework to fetch and create Calendar events without manually writing any Swift or Objective-C code. + +--- + +## Step 1: Create an app and add dependencies + +First, create a new Flutter app template focused on the iOS platform. + +```sh +flutter create --platforms=ios ios_calendar_demo +cd ios_calendar_demo +``` + +Now, add the mandatory runtime bindings package (`objective_c`), the `permission_handler` package to request Calendar access, and the developer-facing generator tool (`ffigen`) as a dev dependency: + +```sh +flutter pub add objective_c permission_handler +flutter pub add dev:ffigen +``` + +--- + +## Step 2: Create the generation config script + +Create a configuration script that details which native classes `ffigen` needs to generate Dart models for. + +Specify `tool/generate_code.dart` at the root of your app directory: + +```sh +mkdir -p tool +touch tool/generate_code.dart +``` + +Add the following configuration code to `tool/generate_code.dart` to target the `EventKit` framework: + +```dart +import 'package:ffigen/ffigen.dart'; + +void main() { + final config = Config( + output: Uri.file('lib/eventkit_bindings.dart'), + language: Language.objc, + name: 'EventKitWrapper', + description: 'Bindings for iOS EventKit framework', + headers: Headers( + entryPoints: [ + Uri.file( + '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/EventKit.framework/Headers/EventKit.h', + ), + ], + ), + objcInterfaces: ObjCInterfaces( + include: { + 'EKEventStore', + 'EKEvent', + 'EKCalendar', + 'NSArray', + 'NSDate', + }, + ), + ); + + final library = FfiGenerator(config).generate(); + library.generateFile(config.output.toFilePath()); +} +``` + +--- + +## Step 3: Generate the bindings + +Run the generator script. This will parse the `EventKit` headers and generate a type-safe Dart API at `lib/eventkit_bindings.dart` along with an Objective-C wrapper file. + +```sh +dart run tool/generate_code.dart +``` + +Because `ffigen` generates an Objective-C wrapper (`lib/eventkit_bindings.dart.m`) to safely map Objective-C blocks and initializers, you need to add it to your Xcode project. + +Update your `ios/Runner/Info.plist` to declare calendar usage: + +```xml +NSCalendarsFullAccessUsageDescription +We need calendar access to fetch and create events. +``` + +--- + +## Step 4: Write the Create Event Dialog + +To allow users to create events, we need a dialog. Create a new file `lib/create_event_dialog.dart` and add the following code. This code uses standard Flutter Date/Time pickers, and directly invokes the native `EKEventStore.saveEvent` API through our generated bindings! + +```dart +import 'package:flutter/material.dart'; +import 'package:objective_c/objective_c.dart'; + +import 'eventkit_bindings.dart'; + +class CreateEventDialog extends StatefulWidget { + final EKEventStore eventStore; + final VoidCallback onEventCreated; + + const CreateEventDialog({ + super.key, + required this.eventStore, + required this.onEventCreated, + }); + + @override + State createState() => _CreateEventDialogState(); +} + +class _CreateEventDialogState extends State { + final _titleController = TextEditingController(); + final _notesController = TextEditingController(); + DateTime _startDate = DateTime.now(); + DateTime _endDate = DateTime.now().add(const Duration(hours: 1)); + + Future _selectDateTime(BuildContext context, bool isStart) async { + final initialDate = isStart ? _startDate : _endDate; + final pickedDate = await showDatePicker( + context: context, + initialDate: initialDate, + firstDate: DateTime(2000), + lastDate: DateTime(2100), + ); + if (pickedDate == null) return; + + if (!context.mounted) return; + + final pickedTime = await showTimePicker( + context: context, + initialTime: TimeOfDay.fromDateTime(initialDate), + ); + if (pickedTime == null) return; + + final finalDateTime = DateTime( + pickedDate.year, + pickedDate.month, + pickedDate.day, + pickedTime.hour, + pickedTime.minute, + ); + + setState(() { + if (isStart) { + _startDate = finalDateTime; + if (_endDate.isBefore(_startDate)) { + _endDate = _startDate.add(const Duration(hours: 1)); + } + } else { + _endDate = finalDateTime; + } + }); + } + + void _saveEvent() { + final event = EKEvent.eventWithEventStore(widget.eventStore); + event.title = _titleController.text.toNSString(); + event.notes = _notesController.text.toNSString(); + event.startDate = _startDate.toNSDate(); + event.endDate = _endDate.toNSDate(); + + final defaultCalendar = widget.eventStore.defaultCalendarForNewEvents; + if (defaultCalendar != null) { + event.calendar = defaultCalendar; + final success = widget.eventStore.saveEvent( + event, + span: EKSpan.EKSpanThisEvent, + commit: true, + ); + if (success) { + widget.onEventCreated(); + } else { + debugPrint('Failed to save event'); + } + } else { + debugPrint('No default calendar found'); + } + + Navigator.of(context).pop(); + } + + @override + void dispose() { + _titleController.dispose(); + _notesController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: const Text('Create Event'), + content: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: _titleController, + decoration: const InputDecoration(labelText: 'Title'), + ), + TextField( + controller: _notesController, + decoration: const InputDecoration(labelText: 'Notes'), + maxLines: 3, + ), + ListTile( + contentPadding: EdgeInsets.zero, + title: const Text('Start Date'), + subtitle: Text('${_startDate.year}-${_startDate.month.toString().padLeft(2, '0')}-${_startDate.day.toString().padLeft(2, '0')} ${_startDate.hour.toString().padLeft(2, '0')}:${_startDate.minute.toString().padLeft(2, '0')}'), + onTap: () => _selectDateTime(context, true), + trailing: const Icon(Icons.calendar_today), + ), + ListTile( + contentPadding: EdgeInsets.zero, + title: const Text('End Date'), + subtitle: Text('${_endDate.year}-${_endDate.month.toString().padLeft(2, '0')}-${_endDate.day.toString().padLeft(2, '0')} ${_endDate.hour.toString().padLeft(2, '0')}:${_endDate.minute.toString().padLeft(2, '0')}'), + onTap: () => _selectDateTime(context, false), + trailing: const Icon(Icons.calendar_today), + ), + ], + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('Cancel'), + ), + ElevatedButton( + onPressed: _saveEvent, + child: const Text('Save'), + ), + ], + ); + } +} +``` + +--- + +## Step 5: Write the Main App + +Now, wire everything together in `lib/main.dart`. We'll request permissions on launch, and provide buttons to Retrieve and Create Events. + +```dart +import 'package:flutter/material.dart'; +import 'package:objective_c/objective_c.dart'; +import 'package:permission_handler/permission_handler.dart'; + +import 'create_event_dialog.dart'; +import 'eventkit_bindings.dart'; + +void main() { + runApp(const MainApp()); +} + +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp(home: CalendarHomePage()); + } +} + +class CalendarHomePage extends StatefulWidget { + const CalendarHomePage({super.key}); + + @override + State createState() => _CalendarHomePageState(); +} + +class _CalendarHomePageState extends State { + bool _hasCalendarPermission = false; + List> _events = []; + late final EKEventStore _eventStore; + + @override + void initState() { + super.initState(); + _eventStore = EKEventStore(); + _checkPermission(); + } + + Future _checkPermission() async { + final status = await Permission.calendarFullAccess.status; + setState(() { + _hasCalendarPermission = status.isGranted; + }); + } + + Future _requestPermission() async { + await Permission.calendarFullAccess + .onGrantedCallback(() { + debugPrint('Granted'); + setState(() { + _hasCalendarPermission = true; + }); + }) + .onDeniedCallback(() { + debugPrint('denied'); + }) + .request(); + } + + void _retrieveEvents() { + final startDate = NSDate.date(); + final endDate = NSDate.dateWithTimeIntervalSinceNow(30.0 * 24 * 60 * 60); + + final calendars = _eventStore.calendars; + final predicate = _eventStore.predicateForEventsWithStartDate( + startDate, + endDate: endDate, + calendars: calendars, + ); + + final NSArray eventsArray = _eventStore.eventsMatchingPredicate(predicate); + + final count = eventsArray.count; + List fetchedEvents = []; + for (int i = 0; i < count; i++) { + final obj = eventsArray.objectAtIndex(i); + final event = EKEvent.as(obj); + fetchedEvents.add(event); + } + + fetchedEvents.sort((a, b) { + return a.startDate.compare(b.startDate).value; + }); + + setState(() { + _events = fetchedEvents.map((e) { + final title = e.title.toDartString(); + final dt = e.startDate.toDateTime(); + return { + 'title': title, + 'date': '${dt.year}-${dt.month.toString().padLeft(2, '0')}-${dt.day.toString().padLeft(2, '0')}', + 'time': '${dt.hour.toString().padLeft(2, '0')}:${dt.minute.toString().padLeft(2, '0')}', + }; + }).toList(); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('EventKit Native Interop Demo')), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ElevatedButton( + onPressed: _hasCalendarPermission ? null : _requestPermission, + child: Text( + _hasCalendarPermission + ? 'Calendar Access Granted' + : 'Request Calendar Permission', + ), + ), + const Divider(height: 32), + ElevatedButton( + onPressed: _hasCalendarPermission + ? () => showDialog( + context: context, + builder: (context) => CreateEventDialog( + eventStore: _eventStore, + onEventCreated: _retrieveEvents, + ), + ) + : null, + child: const Text('Create Event'), + ), + const SizedBox(height: 8), + ElevatedButton( + onPressed: _hasCalendarPermission ? _retrieveEvents : null, + child: const Text('Retrieve Events'), + ), + const SizedBox(height: 24), + const Text( + 'Events', + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + const SizedBox(height: 8), + Expanded( + child: _events.isEmpty + ? const Center(child: Text('No events to display.')) + : SingleChildScrollView( + child: DataTable( + columns: const [ + DataColumn(label: Text('Title')), + DataColumn(label: Text('Date')), + DataColumn(label: Text('Time')), + ], + rows: _events + .map( + (event) => DataRow( + cells: [ + DataCell(Text(event['title'] ?? '')), + DataCell(Text(event['date'] ?? '')), + DataCell(Text(event['time'] ?? '')), + ], + ), + ) + .toList(), + ), + ), + ), + ], + ), + ), + ); + } +} +``` + +## Conclusion + +You have successfully built a Flutter application that interacts directly with iOS APIs! By using `ffigen` and `objective_c`, you can skip writing manual message channels and focus on building high quality Dart code. diff --git a/sites/docs/src/data/sidenav/default.yml b/sites/docs/src/data/sidenav/default.yml index fd238751b9b..066fb979905 100644 --- a/sites/docs/src/data/sidenav/default.yml +++ b/sites/docs/src/data/sidenav/default.yml @@ -409,6 +409,8 @@ permalink: /platform-integration/ios/ios-latest - title: Leverage Apple's system libraries permalink: /platform-integration/ios/apple-frameworks + - title: Use ffigen to use Apple APIs (new) + permalink: /platform-integration/ios/ffigen - title: Add a launch screen permalink: /platform-integration/ios/launch-screen - title: Add iOS App Clip support