Flutter服务管理插件easy_service_manager的使用

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

Flutter服务管理插件easy_service_manager的使用

功能特性

easy_service_manager 插件提供了以下功能:

  • 支持多个设置屏幕
  • 支持Google Play Store和AppStore评分系统
  • 支持 in_app_review 插件
  • 支持 easy_ads_flutter 插件
  • 支持远程配置和JSON数据(如壁纸等)
  • 支持 flutter_local_notifications 插件

使用方法

初始化

在应用程序启动时初始化 EasyServicesManager。你需要提供一些必要的参数,例如广告ID管理器、应用描述、支持邮箱等。

await EasyServicesManager.instance.initialize(
  adIdManager: const MyTestAdIdManager(),
  aboutAppDescription: '您可以在这里添加应用描述。',
  supportEmail: 'mail@example.com',
  itunesMoreAppLink: 'tiktok-ltd/id1322881000',
  androidDeveloperName: 'TikTok+Pte.+Ltd',
  appStoreID: '835599320',
  privacyPolicy: '这是隐私政策。',
  remoteConfigEndpointUrl: 'nooralibutt.github.io/sample.json',
  wallpapersKey: _wallpapersKeyMapper,
  useNotifications: true,
  isAutoScheduleNotification: true,
  notificationsList: const [
    '这是第一条通知',
    '这是第二条通知',
    '这是第三条通知',
    '这是第四条通知',
  ],
);
集成EasyAds

要集成 easy_ads_flutter,你可以在 EasyServicesManager 的初始化中添加 AdIdManager 类。

EasyServicesManager.instance.initialize(adIdManager: const MyTestAdIdManager())
iOS跟踪透明度权限

对于iOS跟踪透明度权限,你需要在 Info.plist 文件中添加以下权限:

<key>NSUserTrackingUsageDescription</key>
<string>此标识符将用于向您投放个性化广告。</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
获取远程数据

你可以通过 EasyServicesManager 获取远程数据:

EasyServicesManager.instance.remoteConfig
更多设置屏幕

有两种方式使用更多设置屏幕:

  1. 独立应用模式
  2. 添加到Widget树

独立应用模式:

Navigator.of(context).push(
  MaterialPageRoute(
    fullscreenDialog: fullscreenDialog,
    builder: (_) => Scaffold(body: EasyServicesManager.instance.moreScreen()),
  ),
);

添加到Widget树:

EasyServicesManager.instance.moreScreen();
显示评分浮动按钮

显示评分浮动按钮:

EasyServicesManager.instance.rateFloatingActionButton();
显示自定义应用内评分对话框

显示自定义应用内评分对话框:

EasyServicesManager.instance.tryShowingCustomInAppReview();
显示广告

你可以显示横幅广告、插页广告和奖励视频广告等。

显示AppOpen广告:

EasyServicesManager.instance.showAppOpenAd();

显示横幅广告:

EasyServicesManager.instance.showBannerAd();

显示插页广告:

EasyServicesManager.instance.showInterstitialAd();

显示计数插页广告:

EasyServicesManager.instance.showCountedInterstitialAd();

显示奖励视频广告:

EasyServicesManager.instance.showRewardedAd();
安排本地通知

安排本地通知需要在 EasyServicesManager 的初始化中传递通知列表。如果你不提供通知列表,本地通知将不会被初始化。

EasyServicesManager.instance.initialize(
  notificationsList: const [
    '这是第一条通知',
    '这是第二条通知',
    '这是第三条通知',
    '这是第四条通知',
  ],
);

对于Android,你需要在 AndroidManifest.xml 中添加以下权限和配置:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationReceiver" />
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
    <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
  </intent-filter>
</receiver>
调度所有通知

调用以下方法调度所有通知列表:

EasyServicesManager.instance.scheduleAllNotifications();
调度单个通知

调用以下方法调度单个通知:

EasyServicesManager.instance.scheduleNotification();
取消通知

调用以下方法取消单个通知:

EasyServicesManager.instance.cancelNotification();
显示欢迎屏幕

显示欢迎屏幕:

[@override](/user/override)
Widget build(BuildContext context) {
  return Scaffold(
    body: WelcomeScreen(
      iconPath: 'https://crosscode.dev/wp-content/uploads/2022/11/crosscode-horizontal-white.png',
      initializeBuilder: initializeBuilder,
      nextScreenRouteName: TabScreen.routeName,
    ),
  );
}

Future<void> initializeBuilder() {
  return EasyServicesManager.instance.initialize(
    // 其他初始化参数
  );
}

示例代码

以下是一个完整的示例代码,展示了如何使用 easy_service_manager 插件:

import 'dart:io';
import 'package:easy_service_manager/easy_service_manager.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyTestAdIdManager extends IAdIdManager {
  const MyTestAdIdManager();

  [@override](/user/override)
  AppAdIds? get admobAdIds => AppAdIds(
        appId: Platform.isAndroid
            ? 'ca-app-pub-3940256099942544~3347511713'
            : 'ca-app-pub-3940256099942544~1458002511',
        appOpenId: Platform.isAndroid
            ? 'ca-app-pub-3940256099942544/3419835294'
            : 'ca-app-pub-3940256099942544/5575463023',
        bannerId: 'ca-app-pub-3940256099942544/6300978111',
        interstitialId: 'ca-app-pub-3940256099942544/1033173712',
        rewardedId: 'ca-app-pub-3940256099942544/5224354917',
      );

  [@override](/user/override)
  AppAdIds? get unityAdIds => AppAdIds(
        appId: Platform.isAndroid ? '4374881' : '4374880',
        bannerId: Platform.isAndroid ? 'Banner_Android' : 'Banner_iOS',
        interstitialId:
            Platform.isAndroid ? 'Interstitial_Android' : 'Interstitial_iOS',
        rewardedId: Platform.isAndroid ? 'Rewarded_Android' : 'Rewarded_iOS',
      );

  [@override](/user/override)
  AppAdIds? get appLovinAdIds => AppAdIds(
        appId: 'YOUR_SDK_KEY',
        bannerId: Platform.isAndroid
            ? 'ANDROID_BANNER_AD_UNIT_ID'
            : 'IOS_BANNER_AD_UNIT_ID',
        interstitialId: Platform.isAndroid
            ? 'ANDROID_INTER_AD_UNIT_ID'
            : 'IOS_INTER_AD_UNIT_ID',
        rewardedId: Platform.isAndroid
            ? 'ANDROID_REWARDED_AD_UNIT_ID'
            : 'IOS_REWARDED_AD_UNIT_ID',
      );

  [@override](/user/override)
  AppAdIds? get fbAdIds => const AppAdIds(
        appId: '1579706379118402',
        interstitialId: 'VID_HD_16_9_15S_LINK#YOUR_PLACEMENT_ID',
        bannerId: 'IMG_16_9_APP_INSTALL#YOUR_PLACEMENT_ID',
        rewardedId: 'VID_HD_16_9_46S_APP_INSTALL#YOUR_PLACEMENT_ID',
      );
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData.dark(useMaterial3: true),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: WelcomeWidget(
        iconPath:
            'https://crosscode.dev/wp-content/uploads/2022/11/crosscode-horizontal-white.png',
        initializeBuilder: initializeBuilder,
        autoDone: true,
        onDone: () => onPressedStandalone(false),
      ),
      floatingActionButton: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          EasyServicesManager.instance.rateFloatingActionButton() ?? const SizedBox(),
          FloatingActionButton(
            heroTag: "onFullScreenPressedStandalone",
            onPressed: () => onPressedStandalone(true),
            child: const Icon(Icons.launch),
          ),
          FloatingActionButton(
            heroTag: "onPressedStandalone",
            onPressed: () => onPressedStandalone(false),
            child: const Icon(Icons.push_pin),
          )
        ],
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
    );
  }

  static Widget getMoreSettings() {
    return EasyServicesManager.instance.moreScreen();
  }

  void onPressedStandalone(bool fullscreenDialog) {
    Navigator.of(context).push(
      MaterialPageRoute(
        fullscreenDialog: fullscreenDialog,
        builder: (_) => Scaffold(body: getMoreSettings()),
      ),
    );
  }

  Future<void> initializeBuilder() {
    return EasyServicesManager.instance.initialize(
      adIdManager: const MyTestAdIdManager(),
      aboutAppDescription: '您可以在这里添加应用描述。',
      supportEmail: 'mail@example.com',
      itunesMoreAppLink: 'tiktok-ltd/id1322881000',
      androidDeveloperName: 'TikTok+Pte.+Ltd',
      appStoreID: '835599320',
      privacyPolicy: '这是隐私政策。',
      remoteConfigEndpointUrl: 'nooralibutt.github.io/sample.json',
      wallpapersKey: _wallpapersKeyMapper,
      useNotifications: true,
      isAutoScheduleNotification: true,
      notificationsList: const [
        '这是第一条通知',
        '这是第二条通知',
        '这是第三条通知',
        '这是第四条通知',
      ],
    );
  }
}

String _wallpapersKeyMapper(bool isAndroidApproving, bool isIosApproving) {
  if (isAndroidApproving || isIosApproving) return 'approving_wallpapers';
  return 'wallpapers';
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用easy_service_manager插件的示例代码。这个插件通常用于服务的管理,比如启动、停止和注册服务等。假设你已经在pubspec.yaml文件中添加了依赖并运行了flutter pub get

pubspec.yaml

首先,确保你的pubspec.yaml文件中包含了easy_service_manager依赖:

dependencies:
  flutter:
    sdk: flutter
  easy_service_manager: ^latest_version  # 替换为最新版本号

main.dart

下面是一个基本的示例,展示如何使用easy_service_manager来管理一个简单的服务。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Easy Service Manager Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  EasyServiceManager? _serviceManager;
  bool _isServiceRunning = false;

  @override
  void initState() {
    super.initState();
    _serviceManager = EasyServiceManager();

    // 注册一个示例服务
    _serviceManager!.registerService(
      'example_service',
      () async {
        // 模拟服务运行
        await Future.delayed(Duration(seconds: 5));
        print('Service completed.');
      },
    );
  }

  @override
  void dispose() {
    // 停止所有服务
    _serviceManager?.stopAllServices();
    super.dispose();
  }

  void _startService() async {
    setState(() {
      _isServiceRunning = true;
    });
    try {
      await _serviceManager!.startService('example_service');
      print('Service started.');
    } catch (e) {
      print('Failed to start service: $e');
    } finally {
      setState(() {
        _isServiceRunning = false;
      });
    }
  }

  void _stopService() async {
    setState(() {
      _isServiceRunning = true;
    });
    try {
      await _serviceManager!.stopService('example_service');
      print('Service stopped.');
    } catch (e) {
      print('Failed to stop service: $e');
    } finally {
      setState(() {
        _isServiceRunning = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Easy Service Manager Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Service is $_isServiceRunning running',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _isServiceRunning ? null : _startService,
              child: Text('Start Service'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: _isServiceRunning ? _stopService : null,
              child: Text('Stop Service'),
            ),
          ],
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:确保在pubspec.yaml文件中添加了easy_service_manager依赖。
  2. 服务管理:在MyHomePage类中,我们创建了一个EasyServiceManager实例,并注册了一个名为example_service的服务。
  3. 服务启动与停止:通过_startService_stopService方法,我们可以启动和停止服务。服务运行时会模拟一个5秒的延迟,并在完成后打印一条消息。
  4. UI交互:在UI中,我们有两个按钮用于启动和停止服务,并显示服务当前的状态。

请注意,这只是一个基本的示例。根据你的实际需求,你可能需要更复杂的逻辑来处理服务的注册、启动和停止。此外,请确保你已经阅读了easy_service_manager的官方文档,以了解所有可用的功能和最佳实践。

回到顶部