Flutter未知功能插件roggle的潜在使用

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

Flutter未知功能插件roggle的潜在使用

插件简介

logo

Roggle 是一个简单、色彩丰富且易于扩展的日志记录工具,适用于Dart。它受到了logger包的启发,并依赖于该包。

  • 测试状态Test
  • 代码覆盖率codecov
  • 许可证MIT

主要特性

  • 默认使用SinglePrettyPrinter类作为打印机。
  • LogOutput类中不使用try-catch机制,以便在发生错误时停止进程。
  • Roggle类中添加了一些getter方法。
  • 将日志接口从dynamic改为Object?

使用示例

基本用法

import 'package:roggle/roggle.dart';

void main() {
  final logger = Roggle();
  logger.d('Roggle is working!');
}

高级配置

您可以使用SinglePrettyPrinter来设置更多选项:

final logger = Roggle(
  printer: SinglePrettyPrinter(
    loggerName: '[APP]', // 每个日志消息打印一个日志名称
    colors: true, // 彩色日志消息
    printCaller: true, // 打印每个日志消息的调用者
    printLocation: true, // 打印调用者的来源位置
    printFunctionName: true, // 打印调用者的函数名
    printEmojis: true, // 打印每个日志消息的表情符号
    printLabels: true, // 打印每个日志消息的级别字符串
    printTime: true, // 打印每个日志消息的时间戳
    stackTraceLevel: Level.error, // 当前日志级别显示堆栈跟踪
    stackTraceMethodCount: 10, // 显示的堆栈跟踪方法数量
    stackTracePrefix: '>>> ', // 替换堆栈跟踪前缀
    levelColors: {}, // 替换级别颜色映射
    levelEmojis: {}, // 替换级别表情符号映射
    levelLabels: {}, // 替换级别标签映射
    timeFormatter: (now) => DateFormat('yyyy/MM/dd HH:mm:ss.SSS').format(now), // 替换时间格式化器
  ),
);

使用Firebase Crashlytics发送错误和日志

final logger = Roggle.crashlytics(
  printer: CrashlyticsPrinter(
    errorLevel: Level.error, // 日志级别高于此级别的将调用onError
    onError: (event) {
      // 发送错误到Firebase Crashlytics
      FirebaseCrashlytics.instance.recordError(
        event.exception,
        event.stack,
        fatal: true,
      );
    },
    onLog: (event) {
      // 发送日志到Firebase Crashlytics
      FirebaseCrashlytics.instance.log(event.message);
    },
    loggerName: '[APP]',
    printCaller: true, // 打印每个日志消息的调用者
    printLocation: true, // 打印调用者的来源位置
    printFunctionName: true, // 打印调用者的函数名
    printEmojis: true, // 打印每个日志消息的表情符号
    printLabels: true, // 打印每个日志消息的级别字符串
    levelEmojis: {}, // 替换级别表情符号映射
    levelLabels: {}, // 替换级别标签映射
  ),
);

错误日志时停止进程

如果您希望在错误日志时停止进程,可以这样做:

import 'package:roggle/roggle.dart';

class AssertionOutput extends ConsoleOutput {
  @override
  void output(OutputEvent event) {
    super.output(event);
    if (event.level.index >= Level.error.index) {
      throw AssertionError('Stopped by logger.');
    }
  }
}

final logger = Roggle(
  output: AssertionOutput(),
);

示例Demo

以下是一个完整的示例demo,展示了如何根据是否为发布模式选择不同的日志记录方式:

// ignore_for_file: avoid_print

import 'package:roggle/roggle.dart';
import 'package:intl/intl.dart'; // 用于时间格式化

bool get isRelease {
  var isRelease = true;
  assert(
    () {
      isRelease = false;
      return true;
    }(),
  );
  return isRelease;
}

const loggerName = '[APP]';

final logger = isRelease
    ? Roggle.crashlytics(
        printer: CrashlyticsPrinter(
          errorLevel: Level.error,
          onError: (event) {
            // 发送错误到Firebase Crashlytics
            print('FirebaseCrashlytics.exception: ${event.exception}');
            event.stack.toString().split('\n').where((line) => line.isNotEmpty).forEach((line) {
              print('FirebaseCrashlytics.stack: $line');
            });
          },
          onLog: (event) {
            // 发送日志到Firebase Crashlytics
            print('FirebaseCrashlytics.log: ${event.message}');
          },
          loggerName: loggerName,
        ),
      )
    : Roggle(
        printer: SinglePrettyPrinter(
          loggerName: loggerName,
          stackTraceLevel: Level.error,
        ),
      );

void main() {
  print(
    'Run with either `dart example/main.dart` or `dart --enable-asserts example/main.dart`.',
  );
  demo();
}

void demo() {
  logger.t('Hello roggle!'); // Trace级别日志
  logger.d(1000); // Debug级别日志
  logger.i(true); // Info级别日志
  logger.i([1, 2, 3]); // Info级别日志,传递列表
  logger.i({'key': 'key', 'value': 'value'}); // Info级别日志,传递Map
  logger.i({'apple', 'banana'}); // Info级别日志,传递Set
  logger.i(() => 'function message'); // Info级别日志,传递函数
  logger.w(Exception('some exception')); // Warn级别日志,传递异常
  logger.e(TypeError()); // Error级别日志,传递类型错误

  try {
    throw Exception('some exception');
  } on Exception catch (e, s) {
    logger.f('fatal...', error: e, stackTrace: s); // Fatal级别日志,包含异常和堆栈信息
  }
}

这个示例展示了如何在Flutter项目中使用Roggle进行日志记录,并根据应用的运行模式(开发或发布)选择不同的日志记录方式。通过这种方式,您可以在开发过程中获得详细的日志输出,而在发布模式下将错误和日志发送到Firebase Crashlytics以进行监控和分析。


更多关于Flutter未知功能插件roggle的潜在使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件roggle的潜在使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,插件(Plugin)是扩展应用功能的关键工具,它们允许Flutter应用访问原生平台(如iOS和Android)的特定功能。虽然“roggle”这个特定的插件名称在Flutter社区中并不知名(可能是个虚构的名称或拼写错误),但我可以展示如何创建一个Flutter插件来访问一个假设的未知功能(例如,我们称之为“Toggle”功能),并展示如何在Flutter应用中使用它。

1. 创建Flutter插件

首先,我们需要在Flutter项目结构中创建一个插件。这里假设你已经有一个Flutter项目,我们将为这个项目创建一个新的插件。

创建插件目录

在你的Flutter项目根目录下,运行以下命令来创建一个新的插件:

flutter create --org com.example --template=plugin toggle_plugin

这将在你的项目根目录下创建一个名为toggle_plugin的新目录。

实现插件功能

接下来,我们需要在插件的iOS和Android实现中分别添加“Toggle”功能。

iOS 实现

toggle_plugin/ios/Classes/TogglePlugin.m中,你可以添加如下代码来定义一个方法,用于模拟“Toggle”功能:

#import <Flutter/Flutter.h>

@interface TogglePlugin : NSObject<FlutterPlugin>
@end

@implementation TogglePlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
    FlutterMethodChannel* channel = [FlutterMethodChannel
                                     methodChannelWithName:@"com.example.toggle_plugin/toggle"
                                     binaryMessenger:registrar.messenger()];
    [channel setMethodCallHandler:^(FlutterMethodCall* call, FlutterResult result) {
      if ([@"toggle" isEqualToString:call.method]) {
        BOOL currentState = [[NSUserDefaults standardUserDefaults] boolForKey:@"toggleState"];
        BOOL newState = !currentState;
        [[NSUserDefaults standardUserDefaults] setBool:newState forKey:@"toggleState"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        result(@(newState));
      } else {
        result(FlutterMethodNotImplemented);
      }
    }];
}
@end
Android 实现

toggle_plugin/android/src/main/kotlin/com/example/toggle_plugin/TogglePlugin.kt中,添加如下代码:

package com.example.toggle_plugin

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.SharedPreferences

class TogglePlugin: FlutterPlugin, MethodCallHandler, ActivityAware {
  private lateinit var channel: MethodChannel
  private lateinit var context: Context
  private lateinit var sharedPreferences: SharedPreferences

  override fun onAttachedToEngine(binding: FlutterPluginBinding) {
    channel = MethodChannel(binding.binaryMessenger, "com.example.toggle_plugin/toggle")
    channel.setMethodCallHandler(this)
    context = binding.applicationContext
    sharedPreferences = context.getSharedPreferences("toggle_plugin", Context.MODE_PRIVATE)
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "toggle") {
      val currentState = sharedPreferences.getBoolean("toggleState", false)
      val newState = !currentState
      with(sharedPreferences.edit()) {
        putBoolean("toggleState", newState)
        apply()
      }
      result.success(newState)
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(binding: FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    // No-op
  }

  override fun onDetachedFromActivityForConfigChanges() {
    // No-op
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    // No-op
  }

  override fun onDetachedFromActivity() {
    // No-op
  }
}

2. 在Flutter应用中使用插件

现在,我们已经在插件中实现了“Toggle”功能,接下来我们需要在Flutter应用中使用这个插件。

添加插件依赖

在你的Flutter项目的pubspec.yaml文件中,添加对本地插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  toggle_plugin:
    path: ./toggle_plugin

使用插件

在你的Flutter应用的Dart代码中,你可以这样使用toggle_plugin

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

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

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example.toggle_plugin/toggle');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Toggle Plugin Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Current Toggle State: Unknown',
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _toggle,
                child: Text('Toggle'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _toggle() async {
    try {
      bool newState = await TogglePlugin.toggle();
      // 在这里更新UI以显示新的状态
      // 例如,使用setState来更新状态变量并刷新UI
      // 但由于这是一个简单的示例,我们仅打印结果
      print('New Toggle State: $newState');
    } on PlatformException catch (e) {
      print("Failed to toggle: '${e.message}'.");
    }
  }
}

注意:上面的Dart代码中直接调用了TogglePlugin.toggle(),但在实际插件使用中,你可能需要在插件的Dart接口文件中(通常是lib/toggle_plugin.dart)定义一个静态方法来封装对原生方法的调用。

结论

以上是一个关于如何创建和使用Flutter插件来访问假设的“Toggle”功能的示例。虽然“roggle”这个插件名称可能是虚构的,但这个过程展示了如何从头开始创建一个Flutter插件,并在Flutter应用中使用它。希望这个示例能帮助你理解Flutter插件的创建和使用过程。

回到顶部