Flutter应用小部件插件flutter_app_widget的使用

Flutter应用小部件插件flutter_app_widget的使用

flutter_app_widget 是一个适用于 Flutter 的应用小部件插件,支持 Android 和 iOS 平台。

示例代码

以下是使用 flutter_app_widget 插件的一个完整示例。该示例展示了如何在 Flutter 应用中初始化小部件插件、监听点击事件,并更新和移除小部件数据。

import 'dart:convert';

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:flutter_app_widget/flutter_app_widget.dart';

import 'flutter_widget_data.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  String uri = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
    // 初始化插件并设置 App Group ID
    FlutterAppWidget.initialized(appGroupId: 'group.com.toner');
    
    // 监听小部件点击事件
    FlutterAppWidget.widgetClicked.listen((event) {
      uri = event?.toString() ?? '';
      setState(() {});
      print('小部件点击事件: $event');
    });
  }

  // 异步方法用于获取平台版本信息
  Future<void> initPlatformState() async {
    String platformVersion;
    
    // 尝试获取平台版本信息,如果失败则返回未知
    try {
      platformVersion = await FlutterAppWidget.platformVersion ?? '未知平台版本';
    } on PlatformException {
      platformVersion = '无法获取平台版本';
    }

    // 如果小部件被移除且消息还在处理中,则返回
    if (!mounted) return;

    // 更新状态
    setState(() {
      _platformVersion = platformVersion;
    });
  }

  late final textController = TextEditingController();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: Column(
          children: [
            Text(
              '请输入文本 🙏🏻, 启动 URI: $uri',
            ),
            TextField(
              controller: textController,
            ),
            ElevatedButton(
                onPressed: () async {
                  print(jsonEncode(
                      FlutterWidgetData(true, textController.text)));
                  final result = await FlutterAppWidget.setWidgetDataAndUpdate(
                      key: 'widgetData',
                      value: jsonEncode(
                          FlutterWidgetData(true, textController.text)),
                      androidWidgetProviderClass: 'RunningWidgetProvider');
                  print('[更新按钮]: $result');
                },
                child: const Text('开始')),
            ElevatedButton(
                onPressed: () async {
                  await FlutterAppWidget.removeWidgetDataAndUpdate(
                      key: 'widgetData',
                      androidWidgetProviderClass: 'RunningWidgetProvider');
                },
                child: const Text('暂停')),
          ],
        ),
      ),
    );
  }
}

代码说明

  1. 导入依赖库

    import 'dart:convert';
    import 'package:flutter/material.dart';
    import 'dart:async';
    import 'package:flutter/services.dart';
    import 'package:flutter_app_widget/flutter_app_widget.dart';
    import 'flutter_widget_data.dart';
    
  2. 初始化应用

    void main() {
      runApp(const MyApp());
    }
    
  3. 定义主应用类

    class MyApp extends StatefulWidget {
      const MyApp({Key? key}) : super(key: key);
      [@override](/user/override)
      State<MyApp> createState() => _MyAppState();
    }
    
  4. 定义状态类

    class _MyAppState extends State<MyApp> {
      String _platformVersion = '未知';
      String uri = '';
      
      [@override](/user/override)
      void initState() {
        super.initState();
        initPlatformState();
        // 初始化插件并设置 App Group ID
        FlutterAppWidget.initialized(appGroupId: 'group.com.toner');
        
        // 监听小部件点击事件
        FlutterAppWidget.widgetClicked.listen((event) {
          uri = event?.toString() ?? '';
          setState(() {});
          print('小部件点击事件: $event');
        });
      }
    
  5. 异步方法用于获取平台版本信息

    Future<void> initPlatformState() async {
      String platformVersion;
      
      // 尝试获取平台版本信息,如果失败则返回未知
      try {
        platformVersion = await FlutterAppWidget.platformVersion ?? '未知平台版本';
      } on PlatformException {
        platformVersion = '无法获取平台版本';
      }
    
      // 如果小部件被移除且消息还在处理中,则返回
      if (!mounted) return;
    
      // 更新状态
      setState(() {
        _platformVersion = platformVersion;
      });
    }
    
  6. 定义文本控制器

    late final textController = TextEditingController();
    
  7. 构建应用界面

    [@override](/user/override)
    Widget build(BuildContext context) {
      return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: const Text('插件示例应用'),
          ),
          body: Column(
            children: [
              Text(
                '请输入文本 🙏🏻, 启动 URI: $uri',
              ),
              TextField(
                controller: textController,
              ),
              ElevatedButton(
                  onPressed: () async {
                    print(jsonEncode(
                        FlutterWidgetData(true, textController.text)));
                    final result = await FlutterAppWidget.setWidgetDataAndUpdate(
                        key: 'widgetData',
                        value: jsonEncode(
                            FlutterWidgetData(true, textController.text)),
                        androidWidgetProviderClass: 'RunningWidgetProvider');
                    print('[更新按钮]: $result');
                  },
                  child: const Text('开始')),
              ElevatedButton(
                  onPressed: () async {
                    await FlutterAppWidget.removeWidgetDataAndUpdate(
                        key: 'widgetData',
                        androidWidgetProviderClass: 'RunningWidgetProvider');
                  },
                  child: const Text('暂停')),
            ],
          ),
        ),
      );
    }
    

更多关于Flutter应用小部件插件flutter_app_widget的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用小部件插件flutter_app_widget的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


flutter_app_widget 是一个用于在 Flutter 应用中创建和管理应用小部件(App Widgets)的插件。应用小部件通常用于在 Android 主屏幕上显示应用的某些信息或功能,用户可以直接与小部件进行交互。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 flutter_app_widget 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_app_widget: ^1.0.0  # 请使用最新版本

然后,运行 flutter pub get 来获取依赖。

2. 配置 Android 项目

由于应用小部件是 Android 特有的功能,你需要在 Android 项目中做一些配置。

2.1 创建小部件布局文件

android/app/src/main/res/layout/ 目录下创建一个 XML 布局文件,例如 widget_layout.xml,用于定义小部件的外观。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/widget_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, Widget!"
        android:textSize="18sp"
        android:layout_centerInParent="true"/>
</RelativeLayout>

2.2 创建小部件提供者

android/app/src/main/java/com/example/yourapp/ 目录下创建一个 Java 或 Kotlin 类,例如 MyAppWidgetProvider.java,用于处理小部件的更新逻辑。

package com.example.yourapp;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.widget.RemoteViews;

public class MyAppWidgetProvider extends AppWidgetProvider {

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
            views.setTextViewText(R.id.widget_text, "Updated Text");
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

2.3 配置 AndroidManifest.xml

android/app/src/main/AndroidManifest.xml 文件中注册小部件提供者。

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

2.4 创建小部件信息文件

android/app/src/main/res/xml/ 目录下创建一个 XML 文件,例如 app_widget_info.xml,用于配置小部件的基本信息。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="40dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/widget_layout"
    android:resizeMode="horizontal|vertical"
    android:widgetCategory="home_screen">
</appwidget-provider>

3. 在 Flutter 中使用 flutter_app_widget

在 Flutter 代码中,你可以使用 flutter_app_widget 插件来更新小部件的内容。

import 'package:flutter/material.dart';
import 'package:flutter_app_widget/flutter_app_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter App Widget Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              // 更新小部件内容
              FlutterAppWidget.updateWidget(
                title: 'New Title',
                message: 'New Message',
              );
            },
            child: Text('Update Widget'),
          ),
        ),
      ),
    );
  }
}
回到顶部