Flutter性能监控插件scouter的使用

Flutter性能监控插件scouter的使用

特性

Scouter 是一个旨在为 Dart 开发者提供类似于 NestJS 体验的包。

  • 路由系统通过注解实现
  • 模块化设计
  • 中间件支持
  • 依赖注入(DI)

入门指南

首先,你需要将 scouter 包添加到你的项目中:

dart pub add scouter

使用说明

你可以在 example/scouter_example.dart 文件中找到更完整的示例。以下是启动应用所需的基本步骤。

应用初始化

main 函数中调用 runServer 函数,并进行相应的设置:

void main() async {
  final appModule = AppModule(
    modules: [
      TestModule(),
    ],
    middlewares: [
      ExampleMidleware(),
      LoggerMiddleware(),
    ],
    controllers: [
      FeatureController(),
      GameController(),
    ],
  );

  runServer(
    appModule,
    port: 8080,
  );
}

应用模块

AppModule 类是你应用的入口点和主模块,它会接收其他模块,例如中间件、控制器等。

class AppModule extends Module {
  AppModule({
    required this.modules,
    required this.middlewares,
    required this.controllers,
    required this.init,
  });

  final List<Module> modules;
  final List<HttpMiddleware> middlewares;
  final List<RestController> controllers;
  final Future<void> Function() init;

  @override
  List<Module> get childModules => modules;

  @override
  List<HttpMiddleware> get globalMiddlewares => middlewares;

  @override
  List<RestController> get controllersList => controllers;

  @override
  Future<void> Function() get initializer => init;
}

模块

每个模块都是应用业务的一个上下文包装器。每个模块可以有自己的控制器和中间件。

class TestModule extends Module {
  TestModule({super.preffix = "teste"});

  @override
  List<RestController> get controllers => [
        GameController(),
        ProfileController(),
      ];

  @override
  List<HttpMiddleware> get middlewares => [];
}

控制器

每个控制器都有一个前缀,你可以选择显式声明它或让 Scouter 自动处理类名来生成前缀。

@HttpController()
class ProfileController extends RestController {
  @Get("/:id")
  getById(HttpRequest request) {
    return ResponseSample();
  }

  @Get("/")
  get(HttpRequest request) {
    return ResponseSample();
  }
}

class ResponseSample {
  String message = "保存成功!";
  int savedId = 70;
  int httpStatus = 206;
}

路由

你可以通过注解给控制器方法添加所需的 HTTP 动词。

@HttpController()
class ProfileController extends RestController {
  @Get("/")
  get(HttpRequest request) {
    ...
  }

  @Post("/")
  save(HttpRequest request) {
    ...
  }
}

动态路由可以通过在路径中使用变量来实现。

@Get("/:id")
getById(HttpRequest request) {
  final id = request.params!["id"];
  ...
}

请求体解析

你可以自动解析自定义类的请求体。

@Post("/save/user")
saveUser(@Body() User user){
  return user;
}

查询参数

查询参数可以通过注解添加到方法参数中。

@Get("/query/:uuid")
search(String uuid, @QueryParam() Map queryParams) {
  return {
    "name": queryParams["name"],
  };
}

响应解析

响应可以返回 HttpResponseMap 或自定义类。

class Profile {
  final int id = 1;
  final String name = "Anything";
  final List<String> tags = ["cool guy", "developer"];
  final String url = "https://pub.dev";

  Map<String, dynamic> toMap() => {
    "name": name,
    "tags": tags,
    "url": url,
  };
}

中间件

中间件可以用于整个应用或单个模块。

class ExampleMidleware implements HttpMiddleware {
  const ExampleMidleware();
  @override
  Future<Either<HttpResponse, void>> handle(HttpRequest request) async {
    if (request.path.contains("/game")) {
      return Left(
        HttpResponse(
          status: 400,
          body: {"status": "/game is not available"},
        ),
      );
    }
    return Right(null);
  }
}

依赖注入

Scouter 提供了一个依赖注入系统,可以通过 Injectable 混入来使用。

@HttpController()
class FeatureController extends RestController {
  FeatureController() {
    inject<FakeProvider>(
      SingletonInjection(
        FakeProvider(),
      ),
    );
  }

  @Post("/save")
  HttpResponse save(HttpRequest request) {
    final FakeProvider teste = injected();
    return HttpResponse(
      body: {
        "teste": teste.name,
      },
    );
  }
}

编译与部署

由于 Scouter 依赖于 dart:mirrors,因此不能以 AOT 方式编译。你可以将其编译为 Kernel 模块并运行。

dart compile kernel bin/your_app.dart

对于部署,建议使用 Docker 容器。

FROM dart:stable AS build

WORKDIR /app

COPY pubspec.* ./
RUN dart pub get

COPY . 

RUN dart pub get --offline
RUN dart compile kernel bin/server.dart -o bin/server

EXPOSE 3000
CMD ["dart", "run", "bin/server"]

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

1 回复

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


在Flutter项目中,使用性能监控插件如Scouter可以帮助你更好地理解和优化应用的性能。Scouter是一个强大的性能监控工具,能够捕捉和分析应用的运行时数据,包括CPU、内存使用情况、帧率等。下面是一个基本的代码案例,展示如何在Flutter项目中集成和使用Scouter进行性能监控。

1. 添加Scouter依赖

首先,你需要在pubspec.yaml文件中添加Scouter的依赖。确保你的Flutter环境是最新的,然后执行以下步骤:

dependencies:
  flutter:
    sdk: flutter
  scouter_flutter_plugin: ^latest_version  # 请替换为实际的最新版本号

运行flutter pub get来安装依赖。

2. 初始化Scouter

在你的Flutter应用的入口文件(通常是main.dart)中,初始化Scouter。你需要提供你的应用ID和服务器地址(这些信息通常由Scouter服务提供商提供)。

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

void main() {
  // 初始化Scouter
  ScouterFlutterPlugin.initialize(
    appId: 'your_app_id', // 替换为你的应用ID
    serverUrl: 'your_server_url', // 替换为你的服务器地址
    enableLog: true, // 是否启用日志记录
  );

  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
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Scouter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '0',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 在按钮点击时记录一个事件
          ScouterFlutterPlugin.trackEvent(eventName: 'button_pressed');
          setState(() {});
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

3. 监控性能数据

Scouter会自动捕捉应用的性能数据,如CPU使用率、内存使用情况、帧率等。这些数据会被发送到Scouter服务器,你可以在那里进行分析和可视化。

4. 自定义监控(可选)

除了自动捕捉的性能数据外,你还可以根据需要自定义监控逻辑。例如,你可以监控特定函数的执行时间:

void someFunction() {
  // 开始计时
  long startTime = System.currentTimeMillis();

  // 执行一些操作
  // ...

  // 结束计时并计算执行时间
  long endTime = System.currentTimeMillis();
  long executionTime = endTime - startTime;

  // 记录执行时间
  ScouterFlutterPlugin.trackMetric(metricName: 'some_function_execution_time', value: executionTime.toDouble());
}

结论

通过以上步骤,你已经成功地在Flutter项目中集成了Scouter性能监控插件。Scouter可以帮助你深入理解应用的性能瓶颈,并采取相应的优化措施。记得根据实际需求调整监控配置和自定义监控逻辑。

回到顶部