创建布局文件:
android/app/src/main/res/layout/xxx.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
android:orientation="vertical"
android:background="@drawable/widget_background"
android:padding="8dp"
android:id="@+id/widget_container">
<TextView
android:id="@+id/widget_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="36sp"
android:textStyle="bold"
tools:text="Title" />
<TextView
android:id="@+id/widget_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
tools:text="Message" />
</LinearLayout>案例中指定了背景widget_background
<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="16.dp"/>
</shape>定义 Android 小部件接收器
AndroidManifest.xml
<receiver android:name="BatteryProvider" android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/battery" />
</receiver>定义小部件提供程序的小部件
android/app/src/main/res/xml/xxx.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/battery"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>编写原生代码
android/app/src/main/kotlin/com.example.battery/xxx.kt 注意头部需要添加包名
package com.example.battery
import android.appwidget.AppWidgetManager
import android.content.Context
import android.content.SharedPreferences
import android.net.Uri
import android.widget.RemoteViews
import com.example.battery.MainActivity
import com.example.battery.R
import es.antonborri.home_widget.HomeWidgetBackgroundIntent
import es.antonborri.home_widget.HomeWidgetLaunchIntent
import es.antonborri.home_widget.HomeWidgetProvider
class BatteryProvider : HomeWidgetProvider() {
override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray, widgetData: SharedPreferences) {
appWidgetIds.forEach { widgetId ->
val views = RemoteViews(context.packageName, R.layout.battery).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("battery://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("battery://message?message=$message"))
setOnClickPendingIntent(R.id.widget_message, pendingIntentWithData)
}
appWidgetManager.updateAppWidget(widgetId, views)
}
}
}编写dart代码
main.dart
HomeWidget.saveWidgetData<String>("title", "剩余电量: ");
HomeWidget.saveWidgetData<String>("message", "80%");
HomeWidget.updateWidget(
name: "BatteryProvider",
iOSName: "Battery",
);