Flutter性能监控插件saga_monitor的使用

Flutter性能监控插件saga_monitor的使用

Saga Monitor用于监控运行中的saga和效果,以跟踪redux_saga中间件。

插件和安装详情可以在pub.dev找到。

使用示例

根据以下示例修改vanilla_counter以测试监控功能。

输出可以打印到控制台。

index.dart

...
var monitor = SimpleSagaMonitor(
    onLog: consoleMonitorLogger);

var sagaMiddleware = createSagaMiddleware(Options(sagaMonitor: monitor));
...

示例输出

.✓Root, duration:11ms, result:(Task{Running:true, Cancelled:false, Aborted:false, Result:null, Error:null})
.   └─ ✓Fork, duration:4ms, result:(Task{Running:true, Cancelled:false, Aborted:false, Result:null, Error:null})
.       ├─ ✓Take, duration:7553ms, result:(Instance of 'IncrementAsyncAction')
.       ├─ ✓Fork, duration:5ms, result:(Task{Running:true, Cancelled:false, Aborted:false, Result:null, Error:null})
.       │   ├─ ✓Delay, duration:1004ms, result:(true)
.       │   └─ ✓Put, duration:2ms, result:(Instance of 'IncrementAction')
.       └─ ⌛Take

检查vanilla_counter示例的monitor-console分支以获取完整的代码。

要处理日志输出的位置,实现onLog事件。以下示例演示如何获取行并将其输出到HTML页面上的div元素。

index.dart

...
var monitor = SimpleSagaMonitor(
    onLog: (SimpleSagaMonitor monitor) {
      var lines = monitor.getLines();
      String s = '';
      lines.forEach((element) {
        s += element + '<br>';
      });
      querySelector('#monitor').innerHtml = s;
    });

var sagaMiddleware = createSagaMiddleware(Options(sagaMonitor: monitor));
...

index.html

...
<p>
    点击次数: <span id="value">0</span> 次
    <button id="increment">+</button>
    <button id="decrement">-</button>
    <button id="incrementIfOdd">如果奇数则递增</button>
    <button id="incrementAsync">异步递增</button>
    </br>
    </br>
    Saga Monitor: <div id="monitor"></div>
</p>
...

检查vanilla_counter示例的monitor-browser分支以获取完整的代码。

完整示例代码

import 'package:redux/redux.dart';
import 'package:redux_saga/redux_saga.dart';
import 'package:saga_monitor/saga_monitor.dart';

// Reducer方法
// 根据分发的动作更改状态
int counterReducer(int state, dynamic action) {
  if (action is IncrementAction) {
    return state + 1;
  } else if (action is DecrementAction) {
    return state - 1;
  }

  return state;
}

// 动作
class IncrementAction {}

class DecrementAction {}

class IncrementAsyncAction {}

// incrementAsync Saga 延迟增加计数
Iterable incrementAsync({dynamic action}) sync* {
  yield Delay(Duration(seconds: 1));
  yield Put(IncrementAction());
}

// counterSaga 接收每个 IncrementAsyncAction
// 动作并分叉 incrementAsync
Iterable counterSaga() sync* {
  yield TakeEvery(incrementAsync, pattern: IncrementAsyncAction);
}

void main() {
  // 创建中间件
  var sagaMiddleware = createSagaMiddleware(Options(
    // 设置saga监控器
    sagaMonitor: SimpleSagaMonitor(onLog: consoleMonitorLogger),
  ));

  // 创建存储并应用中间件
  final store = Store<int>(
    counterReducer,
    initialState: 0,
    middleware: [applyMiddleware(sagaMiddleware)],
  );

  // 附加存储
  sagaMiddleware.setStore(store);

  // 运行根saga
  sagaMiddleware.run(counterSaga);

  // 订阅存储
  store.onChange.listen(render);

  // 分发一些示例事件
  store.dispatch(IncrementAction());
  store.dispatch(IncrementAction());
  store.dispatch(IncrementAction());

  store.dispatch(DecrementAction());

  store.dispatch(IncrementAsyncAction());

  // 输出:
  // 1
  // 2
  // 3
  // 2
  // 2
  // 3
}

// 此方法可以根据存储数据渲染UI
// 目前它只是在每次更改时打印到控制台
void render(int state) {
  print(state);
}

更多关于Flutter性能监控插件saga_monitor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用saga_monitor性能监控插件的示例代码。saga_monitor插件通常用于监控Flutter应用的性能数据,如帧率、CPU使用率、内存使用情况等。

首先,确保你已经在pubspec.yaml文件中添加了saga_monitor依赖:

dependencies:
  flutter:
    sdk: flutter
  saga_monitor: ^最新版本号 # 请替换为最新的版本号

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

接下来,在你的Flutter应用中初始化并使用saga_monitor。以下是一个示例代码:

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

void main() {
  // 初始化SagaMonitor
  SagaMonitor.instance.init(
    enable: true, // 启用性能监控
    serverUrl: 'http://your-monitor-server-url', // 性能数据上报的服务器URL
    appKey: 'your-app-key', // 你的应用标识
    appVersion: '1.0.0', // 你的应用版本
    channel: 'prod', // 渠道标识,如'prod'、'dev'等
  );

  runApp(MyApp());
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  @override
  void initState() {
    super.initState();

    // 开始监控页面加载性能
    SagaMonitor.instance.startPageMonitor('/home');

    // 模拟一些工作来展示性能监控
    Future.delayed(() {
      setState(() {}); // 触发UI重建
      // 结束监控页面加载性能
      SagaMonitor.instance.endPageMonitor('/home');
    }, 2000); // 模拟2秒的加载时间
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Text('Hello, Flutter!'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 手动上报自定义性能数据
          SagaMonitor.instance.customEvent(
            eventName: 'custom_event',
            params: {
              'key1': 'value1',
              'key2': 'value2',
            },
          );
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. main函数中初始化SagaMonitor实例,并配置了必要的参数,如服务器URL、应用标识、应用版本和渠道标识。
  2. MyHomePageinitState方法中,使用SagaMonitor.instance.startPageMonitorSagaMonitor.instance.endPageMonitor来监控页面加载性能。
  3. 在页面的浮动按钮点击事件中,手动上报了一个自定义性能事件。

请注意,your-monitor-server-urlyour-app-key需要替换为你实际使用的监控服务器URL和应用标识。此外,确保你的服务器能够接收并处理saga_monitor上报的性能数据。

这个示例代码展示了如何使用saga_monitor插件进行基本的性能监控,你可以根据需要进一步配置和扩展监控功能。

回到顶部