Flutter后台任务管理插件bg的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter后台任务管理插件bg的使用

平台支持

MacOS
✔️

开始使用

您可以创建自定义小部件并调用更改壁纸的方法。

// 导入bg插件
import 'package:bg/bg.dart';

// 更改壁纸
await Bg().changeWallpaper(
    url: '[您的URL]', // 替换为实际的URL
    scale: style, // [WallpaperScale] 可以是fit、fill、stretch等
    color: color.hex, // 默认值为#ffffff
);

您还可以使用showWallpaperOptions方法,该方法会显示一个底部模态对话框。

await Bg().showWallpaperOptions(
    url: imageUrl, // 图片URL
    context: context, // BuildContext来自父级小部件
);

底部模态对话框示例

自定义示例

文档

注意事项

  • 此包仅支持MACOS。其他平台如iOS存在已知限制:StackOverflow讨论
  • 我们不支持平铺缩放,因为不是所有图像都适合这种设置,并且MacOS本身也不总是显示此选项。

完整示例代码

以下是一个完整的示例代码,展示了如何使用bg插件来更改壁纸:

import 'package:bg/options.dart';
import 'package:flutter/material.dart';
import 'package:bg/bg.dart';
import 'package:flex_color_picker/flex_color_picker.dart';

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

class App extends StatelessWidget {
  const App({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: ThemeData.dark(useMaterial3: true),
        home: const HomePage());
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final _bgPlugin = Bg();

  String demoUrl =
      'https://live.staticflickr.com/65535/51106448871_213c324baf_o_d.jpg';

  WallpaperScale _style = WallpaperScale.stretch;

  // 颜色
  var color = Colors.white;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: DecorationImage(
            image: NetworkImage(demoUrl),
            fit: BoxFit.cover,
          ),
        ),
        child: Flex(
          direction: Axis.vertical,
          children: [
            ListTile(
              leading: DropdownButton<WallpaperScale>(
                underline: Container(),
                value: _style,
                onChanged: (value) {
                  setState(() {
                    _style = value!;
                  });
                },
                items: WallpaperScale.values
                    .map(
                      (e) => DropdownMenuItem(
                        value: e,
                        child: Text(e.toString().split('.').last),
                      ),
                    )
                    .toList(),
              ),
              title: TextFormField(
                initialValue: demoUrl,
                onChanged: (value) {
                  setState(() {
                    demoUrl = value;
                  });
                },
                decoration: const InputDecoration(
                  hintText: 'Image URL',
                ),
              ),
            ),
            ColorPicker(
              pickersEnabled: const {
                ColorPickerType.both: true,
              },
              color: color,
              onColorChanged: (value) {
                setState(() {
                  color = value;
                });
              },
            ),
          ],
        ),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          FloatingActionButton(
            heroTag: 'changeWallpaper',
            onPressed: () async {
              await _bgPlugin.changeWallpaper(
                url: demoUrl,
                scale: _style,
                color: color.hex,
              );
            },
            child: const Icon(Icons.wallpaper),
          ),
          const SizedBox(height: 10),
          FloatingActionButton(
            heroTag: 'showWallpaperOptions',
            onPressed: () async {
              await _bgPlugin.showWallpaperOptions(
                url: demoUrl,
                context: context,
              );
            },
            child: const Icon(Icons.settings),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter后台任务管理插件bg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后台任务管理插件bg的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,bg(background_fetch)插件是一个强大的工具,用于在iOS和Android平台上执行后台任务。以下是如何在Flutter项目中使用background_fetch插件的一个基本示例。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加background_fetch依赖:

dependencies:
  flutter:
    sdk: flutter
  background_fetch: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android和iOS

Android

AndroidManifest.xml中添加必要的权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

iOS

Info.plist中添加后台模式权限:

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
</array>

并确保在Xcode的Capabilities中启用Background Modes和Background fetch。

3. 初始化并配置Background Fetch

在你的main.dart文件中,初始化并使用background_fetch插件:

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

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

  // 配置并启动后台任务
  BackgroundFetch.configure(
    backgroundFetchConfig,
    onBackgroundFetch: backgroundFetchEvent,
  ).then((String status) {
    print("[BackgroundFetch] configure success: $status");
    BackgroundFetch.start().then((int taskId) {
      print("[BackgroundFetch] start success: taskId = $taskId");
    });
  }).catchError((e) {
    print("[BackgroundFetch] configure ERROR: $e");
  });
}

// 配置后台获取任务的参数
Map<String, dynamic> backgroundFetchConfig = {
  "minimumFetchInterval": 15, // 最小获取间隔(分钟)
  "stopOnTerminate": false,   // 应用程序终止后是否停止后台获取
  "enableHeadless": true,     // 是否启用无头模式(在应用程序终止后仍能执行任务)
  "requiresBatteryNotLow": false, // 是否要求电池电量不低
  "requiresCharging": false,      // 是否要求设备正在充电
  "requiresStorageNotLow": false, // 是否要求存储空间不低
};

void backgroundFetchEvent() async {
  print("[BackgroundFetch] Event received");

  // 在这里执行你的后台任务
  // 例如,执行网络请求、数据库操作等

  // 完成后,必须使用BackgroundFetch.finish来通知系统任务已完成
  BackgroundFetch.finish(BackgroundFetchResult.newData);
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Background Fetch Example'),
        ),
        body: Center(
          child: Text('Check the console for background fetch events'),
        ),
      ),
    );
  }
}

4. 处理无头模式(可选)

如果你的应用需要在终止后仍能执行任务,你需要创建一个无头Dart入口文件,比如background_fetch_headless_task.dart

import 'package:background_fetch/background_fetch.dart';
import 'dart:async';

void backgroundFetchHeadlessTask(String taskId) async {
  print("[BackgroundFetch] Headless task started: $taskId");

  // 在这里执行你的后台任务
  // 例如,更新数据、发送通知等

  // 完成后,必须使用BackgroundFetch.finish来通知系统任务已完成
  BackgroundFetch.finish(taskId, BackgroundFetchResult.newData);

  // 如果需要在任务完成后重启应用(Android特有),可以使用以下代码:
  // if (Platform.isAndroid) {
  //   Workmanager().executeTask("YOUR_TASK_UNIQUE_NAME");
  // }
}

void _headlessCallbackDispatcher() {
  BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
}

void main() {
  Timer.run(() => _headlessCallbackDispatcher());
}

确保在android/app/src/main/AndroidManifest.xml<application>标签中添加以下代码以注册无头服务:

<service
    android:name="com.transistorsoft.flutter.backgroundfetch.HeadlessTaskService"
    android:exported="true"
    android:permission="android.permission.BIND_JOB_SERVICE">
    <intent-filter>
        <action android:name="com.transistorsoft.flutter.backgroundfetch.HEADLESS_TASK" />
    </intent-filter>
</service>

并在ios/Runner/Info.plist中添加:

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>remote-notification</string> <!-- 如果需要处理远程通知 -->
</array>

这个示例展示了如何使用background_fetch插件在Flutter应用中配置和管理后台任务。请根据你的具体需求调整代码。

回到顶部