Flutter通信插件mellowtel的使用

Flutter通信插件mellowtel的使用

Mellowtel 是一个开源的、可选择加入的透明收益引擎,适用于Flutter应用。

使用

通过Mellowtel的开源库,您的用户可以共享他们未使用的部分互联网流量,使用一个透明的选择加入/退出机制。可信合作伙伴——从初创公司到501©(3)非营利组织——可以通过该网络访问互联网,而您将获得一部分收入(约1000名用户 -> 大约每月50美元)。

您可以注册以加入成为开发者。

安装

在您的 pubspec.yaml 文件中添加 mellowtel

flutter pub add mellowtel

当在macOS上运行时,请配置macOS App沙盒,仅提供网络权限。(跳过硬件权限)

使用

1. 初始化 Mellowtel

首先,使用您的唯一配置密钥和用户同意弹窗的详细信息创建一个 Mellowtel 实例。

import 'package:mellowtel/mellowtel.dart';

final Mellowtel mellowtel = Mellowtel("mellowtel_key",
  dialogConfiguration: const ConsentDialogConfiguration(
    appName: 'King Kong',
    incentive: '赚取500个硬币在Sling Kong游戏里',
    appIcon: 'asset/logo.png', // 可选
    acceptButtonText: '我要硬币!', // 可选
  ),
);

2. 开始抓取过程

使用 start() 方法来通知 mellowtel 开始操作。

await mellowtel.start(
  context, // [BuildContext] 用于显示同意弹窗。
  onOptIn: () async {
    // 同意提供服务时处理启用服务。
  }, 
  onOptOut: () async {
    // 拒绝同意时处理禁用服务。
  },
);

这将在首次打开时为用户提供一个选择同意的弹窗。

同意弹窗

3. 同意设置页面(可选)

Mellowtel 确保您的用户拥有完全的控制权和隐私。您的用户可以在任何时候从同意设置页面更改他们的同意状态。您可以在应用的设置页面中提供此选项。

await mellowtel.showConsentSettingsPage(
  context,
  onOptIn: () async {
    // 同意提供服务时处理启用服务。
  }, 
  onOptOut: () async {
    // 拒绝同意时处理禁用服务。
  },
);

设置弹窗

4. 部署前检查

为了确保 mellowtel 正常运行,在部署之前测试您的应用,并将 showDebugLogs 设置为 true

import 'package:mellowtel/mellowtel.dart';

final Mellowtel mellowtel = Mellowtel(
  // 其他参数
  showDebugLogs: true
);

这应该会在几分钟内开始在调试日志中显示 [MELLOWTEL]: USAGE SUCCESS。如果看不到日志或遇到错误日志,请联系 Mellowtel 支持。

平台支持

该包支持iOS、macOS和Windows平台。Android和Web平台暂不支持。

如遇任何错误,请在GitHub问题页面报告。

未来支持

我们正在努力为Android和Web平台添加支持。敬请关注更新。


示例代码

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

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('HTML提取器管理器'),
        ),
        body: const HtmlExtractorWidget(),
      ),
    );
  }
}

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

  [@override](/user/override)
  HtmlExtractorWidgetState createState() => HtmlExtractorWidgetState();
}

class HtmlExtractorWidgetState extends State<HtmlExtractorWidget> {
  final Mellowtel mellowtel = Mellowtel("123",
      dialogConfiguration: const ConsentDialogConfiguration(
        appName: 'King Kong',
        incentive: '赚取500个硬币在Sling Kong游戏里',
        appIcon: 'asset/logo.png', // 可选
        acceptButtonText: '我要硬币!', // 可选
      ),
      showDebugLogs: true);

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Center(
            child: ElevatedButton(
              onPressed: () async {
                await mellowtel.start(context, showConsentDialog: true,
                    onOptIn: () async {
                  // 同意提供服务时处理启用服务。
                }, onOptOut: () async {
                  // 拒绝同意时处理禁用服务。
                });
              },
              child: const Text('开始'),
            ),
          ),
          const SizedBox(height: 16.0),
          Center(
            child: ElevatedButton(
              onPressed: () async {
                await mellowtel.showConsentSettingsPage(context,
                    onOptIn: () async {
                  // 同意提供服务时处理启用服务。
                }, onOptOut: () async {
                  // 拒绝同意时处理禁用服务。
                });
              },
              child: const Text('设置'),
            ),
          ),
          const SizedBox(height: 16.0),
        ],
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    mellowtel.stop();
    super.dispose();
  }
}

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

1 回复

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


在Flutter中,与原生平台(Android和iOS)进行通信通常需要使用插件。mellowtel 不是一个广为人知的Flutter插件,但假设它是一个用于某种特定通信功能的插件(例如,发送短信、电话呼叫等),我们可以根据一般Flutter插件的使用方式来提供一个示例。需要注意的是,如果 mellowtel 插件有特定的API和用法,你应该查阅其官方文档以获取准确信息。

不过,由于mellowtel可能不是官方的或广泛使用的插件,我将提供一个假设性的示例,展示如何在一个假想的通信插件中封装和调用原生代码。如果你确实有一个具体的mellowtel插件,请确保参考其文档来调整以下代码。

假设性插件使用示例

1. 创建Flutter插件项目(如果mellowtel不是现成的)

首先,你可能需要创建一个Flutter插件项目,如果你没有现成的mellowtel插件。这可以通过Flutter命令行工具完成:

flutter create --template=plugin mellowtel

2. 在android文件夹中编写原生代码

mellowtel/android/src/main/java/com/example/mellowtel/MellowtelPlugin.java中编写Android平台的实现:

package com.example.mellowtel;

import androidx.annotation.NonNull;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;

public class MellowtelPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
  private MethodChannel channel;
  private Context applicationContext;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "mellowtel");
    channel.setMethodCallHandler(this);
    applicationContext = flutterPluginBinding.getApplicationContext();
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("sendSms")) {
      String phoneNumber = call.argument("phoneNumber");
      String message = call.argument("message");

      if (phoneNumber == null || message == null) {
        result.error("INVALID_ARGUMENT", "Phone number and message must not be null", null);
        return;
      }

      SmsManager smsManager = SmsManager.getDefault();
      smsManager.sendTextMessage(phoneNumber, null, message, null, null);
      result.success(null);
    } else {
      result.notImplemented();
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }

  @Override
  public void onAttachedToActivity(ActivityPluginBinding binding) {
    // No-op
  }

  @Override
  public void onDetachedFromActivityForConfigChanges() {
    // No-op
  }

  @Override
  public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
    // No-op
  }

  @Override
  public void onDetachedFromActivity() {
    // No-op
  }
}

3. 在ios文件夹中编写原生代码(如果使用iOS)

由于iOS开发通常使用Swift或Objective-C,这里只提供一个Swift的示例框架:

mellowtel/ios/Classes/MellowtelPlugin.swift中:

import Flutter

public class MellowtelPlugin: NSObject, FlutterPlugin {
  public static func register(with registrar: FlutterRegistrar) {
    let channel = FlutterMethodChannel(name: "mellowtel", binaryMessenger: registrar.messenger())
    let instance = MellowtelPlugin()
    registrar.addMethodCallDelegate(instance, channel: channel)
  }

  public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
    if call.method == "sendSms" {
      guard let phoneNumber = call.arguments?["phoneNumber"] as? String,
            let message = call.arguments?["message"] as? String else {
        result(FlutterError(code: "INVALID_ARGUMENT", message: "Phone number and message must not be null", details: nil))
        return
      }
      
      // 假设有一个发送SMS的方法(这里需要iOS的原生实现)
      // sendSMS(to: phoneNumber, message: message) { success in
      //   if success {
      //     result(nil)
      //   } else {
      //     result(FlutterError(code: "SEND_FAILED", message: "Failed to send SMS", details: nil))
      //   }
      // }
      
      // 由于这是一个假设性示例,我们直接返回成功
      result(nil)
    } else {
      result(FlutterMethodNotImplementedError(methodName: call.method))
    }
  }
}

注意:上面的iOS代码缺少实际的SMS发送逻辑,因为iOS上发送SMS需要用户交互,通常通过MFMessageComposeViewController来实现,这超出了简单方法调用的范围。

4. 在Flutter中使用插件

在你的Flutter项目中,添加对插件的依赖(如果它是一个独立的包),然后你可以这样调用它:

import 'package:flutter/material.dart';
import 'package:mellowtel/mellowtel.dart'; // 假设包名是mellowtel

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Mellowtel Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _sendSms,
            child: Text('Send SMS'),
          ),
        ),
      ),
    );
  }

  Future<void> _sendSms() async {
    try {
      await Mellowtel.sendSms(phoneNumber: '1234567890', message: 'Hello, this is a test message!');
      print('SMS sent successfully');
    } catch (e) {
      print('Failed to send SMS: $e');
    }
  }
}

注意:上面的Dart代码假设mellowtel插件有一个静态方法sendSms,这取决于你如何在插件中定义接口。如果mellowtel插件的实际API不同,请相应调整代码。

由于mellowtel可能不是一个真实存在的插件,上述代码是一个假设性的示例,展示了如何创建一个Flutter插件来封装原生功能,并在Flutter应用中调用它。如果你有一个具体的mellowtel插件,请参考其官方文档和示例代码。

回到顶部