Flutter性能监控与分析插件truesight_flutter的使用
Flutter性能监控与分析插件truesight_flutter的使用
引言
本README描述了truesight_flutter
包。如果你将此包发布到pub.dev,此README的内容将出现在你的包的首页。
有关如何编写好的包README的信息,请参阅编写包页面指南。
有关开发包的一般信息,请参阅Dart指南创建包和Flutter指南开发包和插件。
目录
开始使用
要安装此包,请运行:
flutter pub add truesight_flutter go_router intl
依赖项
此包依赖于一些必须手动安装的库:
dependencies:
# ...others
carbon_icons:
git: https://github.com/thanhtunguet/carbon-icons.git
使用
JSON序列化
该库提供了以下类:
DataModel
:表示应用程序中的实体,通常映射到后端数据库中的表。DataFilter
:特定DataModel
的过滤集。
约定:每个DataModel
应该有一个对应的DataFilter
。
应用程序中的实体和过滤器应该扩展这两个类。
要定义一个新类,请考虑以下示例,其中包含AppUser
类:
class AppUser extends DataModel {
@override
List<JsonField> get fields => [
username,
password,
email,
isAdmin,
dateOfBirth,
age,
level,
manager,
members,
];
JsonString username = JsonString('username', isRequired: false, helper: '用户名');
JsonString password = JsonString('password', isRequired: false, helper: '密码');
JsonString email = JsonString('email', isRequired: false, helper: '电子邮件');
JsonBoolean isAdmin = JsonBoolean('isAdmin', isRequired: false, helper: '用户是否为管理员');
JsonDate dateOfBirth = JsonDate('dateOfBirth', isRequired: false, helper: '用户的出生日期');
JsonInteger age = JsonInteger('age', isRequired: false, helper: '用户的年龄');
JsonDouble level = JsonDouble('level', isRequired: false, helper: '用户的等级');
JsonObject<AppUser> manager = JsonObject('manager', isRequired: false, helper: '用户的经理');
JsonList<AppUser> members = JsonList<AppUser>('members', isRequired: false, helper: '用户管理的成员');
}
解释:
fields
getter:这些是从后端获取数据时自动映射的JSON字段。- JSON数据字段由以下类表示:
类 | Dart数据类型 |
---|---|
JsonDate |
DateTime |
JsonBoolean |
bool |
JsonString |
String |
JsonInteger |
int |
JsonDouble |
double |
JsonNumber |
num |
JsonObject |
DataModel |
JsonList |
List<DataModel> |
JsonXYZ
类继承自JsonField
。
从JSON映射数据
final json = await requestFromAPI();
AppUser user = AppUser();
user.fromJSON(json);
转换为JSON
AppUser user = AppUser();
user.toJSON(); // 返回用户的一般JSON表示形式,通常是一个Dart Map对象。
user.toString(); // 返回用户作为Dart字符串的JSON表示形式。
高级过滤器
类似于JSON类,库定义了FilterField
数据类型如下:
类 | Dart数据类型 | JSON数据类型 |
---|---|---|
StringFilter |
String |
JsonString |
DateFilter |
DateTime |
JsonDate |
GuidFilter |
String |
JsonString |
IdFilter |
int |
JsonInteger |
IntFilter |
int |
JsonInteger |
DoubleFilter |
double |
JsonDouble |
NumberFilter |
num |
JsonNumber |
HTTP请求
存储库类执行对后端的API调用来获取数据。
每个HttpRepository
类可以代表一组API,对应特定的业务逻辑,如用户登录(UserRepository
)或产品管理(ProductRepository
)。
HttpRepository
类可以与@singleton
注解一起使用,来自injectable
包结合get_it
进行依赖注入。
HttpRepository
类中的每个方法都对应一个特定的API。
@singleton
class UserRepository extends HttpRepository {
@override
InterceptorsWrapper interceptorWrapper = InterceptorsWrapper();
@override
String? get baseUrl => 'https://app.example.com';
Future<AppUser> login(String username, String password) {
return post("/login", data: {
'username': username,
'password': password,
})
.then((response) => response.body<AppUser>(AppUser));
}
}
TrueSightService
TrueSightService
是一个单例类,旨在使用Hive进行本地存储和dotenv进行环境变量管理来处理应用程序范围的设置和配置管理。此服务提供了一种初始化必要配置并管理faceIdEnabled
和baseApiUrl
等设置的方式。
初始化
initialize
使用可选参数初始化服务以启用dotenv和Hive。
参数
enableDotenv
(bool): 如果为true
,则使用flutter_dotenv
包加载环境变量。默认值为true
。enableHive
(bool): 如果为true
,则初始化Hive并打开用于存储的盒。默认值为true
。
使用
await truesightService.initialize(
enableDotenv: true,
enableHive: true,
);
属性
faceIdEnabled
faceIdEnabled
设置的getter和setter。此设置控制应用中是否启用Face ID。
Getter
返回一个bool
指示Face ID是否已启用。如果未设置,则默认为true
。
Setter
设置faceIdEnabled
值。
使用
// 获取faceIdEnabled
bool isFaceIdEnabled = truesightService.faceIdEnabled;
// 设置faceIdEnabled
truesightService.faceIdEnabled = false;
baseApiUrl
baseApiUrl
设置的getter和setter。此设置包含API的基本URL。如果未在Hive中设置,则从环境变量检索。
Getter
返回包含基本API URL的String
。如果在Hive中未设置值,则从环境变量中检索。
Setter
设置baseApiUrl
值。
使用
// 获取baseApiUrl
String apiUrl = truesightService.baseApiUrl;
// 设置baseApiUrl
truesightService.baseApiUrl = 'https://api.example.com';
私有方法
_getOrCreate
一个实用方法,从Hive检索值或使用默认值创建不存在的值。
参数
key
(String): 在Hive中的值键。defaultValue
(dynamic): 如果键不存在,则使用的默认值。
返回
- 与键关联的值,或如果键不存在则返回默认值。
示例
以下是如何在Flutter应用程序中使用TrueSightService
的示例:
import 'package:flutter/material.dart';
import 'path_to_your_service/truesight_app_service.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await truesightService.initialize();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Truesight App Service Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Face ID Enabled: ${truesightService.faceIdEnabled}'),
Text('Base API URL: ${truesightService.baseApiUrl}'),
ElevatedButton(
onPressed: () {
truesightService.faceIdEnabled = !truesightService.faceIdEnabled;
},
child: Text('切换Face ID'),
),
ElevatedButton(
onPressed: () {
truesightService.baseApiUrl = 'https://newapi.example.com';
},
child: Text('设置新的API URL'),
),
],
),
),
),
);
}
}
自定义图像提供程序
设计了一个自定义图像提供程序,用于从服务器获取带有附加身份验证令牌的图像。
概述
TrueSightImageProvider
类扩展了ImageProvider<Uri>
,并修改了图像加载行为以包括从cookie中获取的身份验证令牌。
构造函数
TrueSightImageProvider(String url)
构造一个TrueSightImageProvider
实例,并提供图像URL。
方法
obtainKey(ImageConfiguration configuration)
: 异步获取图像的键。将身份验证令牌附加到URL的查询参数中。loadImage(Uri key, ImageDecoderCallback decode)
: 使用HTTP客户端从指定的URL加载图像,并添加身份验证头。通过块事件跟踪加载进度。
示例用法
import 'package:flutter/material.dart';
class MyImageWidget extends StatelessWidget {
final String imageUrl = 'https://example.com/image.jpg';
@override
Widget build(BuildContext context) {
final imageProvider = TrueSightImageProvider(imageUrl);
return Image(
image: imageProvider,
fit: BoxFit.cover,
);
}
}
在这个例子中,TrueSightImageProvider
被用作Image
小部件的图像提供程序,确保图像被正确地带身份验证地获取。
小部件文档
- AppNavigationBar
- AppTitle
- BodyText
- CarbonButton
- ConfirmationDialog
- EllipsisText
- GoBackButton
- IconPlaceholder
- ImagePlaceholder
- SignInButton
- SimpleInfiniteList
- StatefulTextFormField
Cookie管理
在我们的应用中,Cookie被管理以高效地处理用户会话和身份验证令牌。Cookie使用SharedPreferences
包进行存储,允许持久存储设备上的键值对。
概述
Cookie对于维护用户会话和处理身份验证至关重要。以下扩展方法和函数简化了应用中Cookie的存储、检索和清除。
存储Cookie
Cookie从Set-Cookie
头解析出来,并带有前缀存储在SharedPreferences
中。parseSetCookie
函数处理此解析:
Map<String, String> parseSetCookie(String setCookieString) {
Map<String, String> cookies = {};
List<String> parts = setCookieString.split('; ');
if (parts.isNotEmpty && parts[0].contains('=')) {
List<String> keyValue = parts[0].split('=');
if (keyValue.length == 2) {
cookies[_getCookieKey(keyValue[0])] = keyValue[1];
}
}
return cookies;
}
检索Cookie
Cookie从SharedPreferences
中使用getCookies
函数检索。此函数检索所有具有指定前缀的键,并构建一个Cookie的映射:
Future<Map<String, dynamic>> getCookies() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final Set<String> keys = prefs.getKeys();
final Map<String, dynamic> prefsMap = {};
for (String key in keys) {
if (_isCookieKey(key)) {
prefsMap[_getCookieKeyReversed(key)] = prefs.get(key);
}
}
return prefsMap;
}
清除Cookie
Cookie可以从SharedPreferences
中使用clearCookies
函数清除。此函数移除所有具有指定前缀的键:
Future<void> clearCookies() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final Set<String> keys = prefs.getKeys();
for (String key in keys) {
if (_isCookieKey(key)) {
prefs.remove(key);
}
}
}
Cookie扩展方法
Map<String, dynamic>
上的扩展方法提供了对特定Cookie(如token
和refreshToken
)的便捷访问:
extension TrueSightCookies on Map<String, dynamic> {
String? get token => this['Token'];
String? get refreshToken => this['RefreshToken'];
bool get hasToken => this['Token'] != null;
bool get hasRefreshToken => this['RefreshToken'] != null;
}
这些方法简化了在应用各部分中检索和使用Cookie的过程。
示例用法
以下是应用中如何使用Cookie管理函数的示例:
// 解析并存储Set-Cookie头
String setCookieHeader = 'Token=abc123; Path=/; HttpOnly';
Map<String, String> cookies = parseSetCookie(setCookieHeader);
// 使用SharedPreferences存储解析后的Cookie
// ...
// 检索存储的Cookie
Future<void> printStoredCookies() async {
Map<String, dynamic> cookies = await getCookies();
print('Stored Token: ${cookies.token}');
}
// 清除存储的Cookie
Future<void> clearStoredCookies() async {
await clearCookies();
print('Cookies cleared');
}
通过这些函数和扩展,管理应用中的Cookie变得简单且高效。
日期和时间格式
我们的应用使用各种日期和时间格式,以确保一致性和可读性,特别是针对越南本地化。这些格式定义在DateTimeFormatsVN
类中,可以在整个应用中轻松使用。
可用格式
DateTimeFormatsVN
类定义了几种常见的日期和时间格式:
-
完整日期和时间:
dd/MM/yyyy HH:mm:ss
- 示例:
01/01/2024 14:30:45
- 示例:
-
不带秒的日期和时间:
dd/MM/yyyy HH:mm
- 示例:
01/01/2024 14:30
- 示例:
-
仅日期:
dd/MM/yyyy
- 示例:
01/01/2024
- 示例:
-
仅时间:
HH:mm:ss
- 示例:
14:30:45
- 示例:
-
仅天和月:
dd/MM
- 示例:
01/01
- 示例:
-
仅年份:
yyyy
- 示例:
2024
- 示例:
-
带有星期几的日期:
EEEE, dd/MM/yyyy
- 示例:
Thứ Hai, 01/01/2024
- 示例:
-
带有月份名称的日期:
dd MMMM yyyy
- 示例:
01 Tháng Giêng 2024
- 示例:
-
带有月份名称的短日期:
dd MMM
- 示例:
01 Thg 01
- 示例:
格式化日期
DateTimeFormatsVN
类包括一个辅助函数,使用指定的格式格式化DateTime
对象:
static String format(DateTime dateTime, String format) {
return DateFormat(format, 'vi').format(dateTime);
}
你可以使用此函数根据预定义的格式格式化日期。例如:
DateTime now = DateTime.now();
String formattedDate = DateTimeFormatsVN.format(now, DateTimeFormatsVN.dateTime);
print(formattedDate); // 输出:01/01/2024 14:30:45
日期扩展方法
我们还提供了一个DateTime
类的扩展方法,简化了格式化过程。此方法使用默认格式但允许自定义:
extension DateTimeFormatter on DateTime {
String format({
String dateFormat = DateTimeFormatsVN.dateOnly,
}) {
return DateFormat(dateFormat).format(toLocal());
}
}
使用扩展方法的示例:
DateTime now = DateTime.now();
String formattedDate = now.format();
print(formattedDate); // 输出:01/01/2024
String customFormattedDate = now.format(dateFormat: DateTimeFormatsVN.dateWithDayName);
print(customFormattedDate); // 输出:Thứ Hai, 01/01/2024
总结
通过使用DateTimeFormatsVN
类和DateTimeFormatter
扩展,你可以轻松地在应用中格式化日期和时间,确保一致性并为越南用户提供本地化支持。
附加信息
此包正在开发中。如有问题请随时提出。
更多关于Flutter性能监控与分析插件truesight_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter性能监控与分析插件truesight_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
truesight_flutter
是一个用于 Flutter 应用程序性能监控与分析的插件。它可以帮助开发者实时监控应用的性能指标,如帧率、内存使用、CPU 使用率等,从而优化应用的性能。
安装 truesight_flutter
-
添加依赖:首先,在
pubspec.yaml
文件中添加truesight_flutter
的依赖。dependencies: truesight_flutter: ^1.0.0 # 请查看最新版本
-
安装依赖:在终端中运行以下命令来安装依赖。
flutter pub get
使用 truesight_flutter
-
初始化:在
main.dart
文件中初始化truesight_flutter
。import 'package:truesight_flutter/truesight_flutter.dart'; void main() { TruesightFlutter.initialize(); runApp(MyApp()); }
-
性能监控:
truesight_flutter
会自动开始监控应用的性能指标。你可以在应用运行时查看这些指标。 -
查看性能数据:你可以通过
TruesightFlutter
提供的 API 来获取性能数据。// 获取当前帧率 double? fps = TruesightFlutter.getFPS(); // 获取当前内存使用情况 int? memoryUsage = TruesightFlutter.getMemoryUsage(); // 获取当前CPU使用率 double? cpuUsage = TruesightFlutter.getCPUUsage();
-
自定义监控:你还可以自定义监控的间隔时间和其他参数。
TruesightFlutter.setMonitoringInterval(Duration(seconds: 5));
性能分析
truesight_flutter
不仅可以监控性能指标,还可以帮助你分析应用的性能瓶颈。你可以使用它来检测哪些部分的应用代码导致了性能问题。
-
分析性能瓶颈:你可以使用
TruesightFlutter
提供的工具来分析应用中的性能瓶颈。TruesightFlutter.startPerformanceAnalysis();
-
生成性能报告:在分析完成后,你可以生成一个性能报告,报告中会包含详细的性能数据和分析结果。
TruesightFlutter.generatePerformanceReport();
集成到 CI/CD
truesight_flutter
还可以集成到你的 CI/CD 流程中,以自动化性能测试和监控。你可以在每次构建时自动运行性能测试,并将结果报告给开发团队。
示例代码
以下是一个简单的示例,展示了如何在 Flutter 应用中使用 truesight_flutter
。
import 'package:flutter/material.dart';
import 'package:truesight_flutter/truesight_flutter.dart';
void main() {
TruesightFlutter.initialize();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Truesight Flutter Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 获取性能数据
double? fps = TruesightFlutter.getFPS();
int? memoryUsage = TruesightFlutter.getMemoryUsage();
double? cpuUsage = TruesightFlutter.getCPUUsage();
print('FPS: $fps');
print('Memory Usage: $memoryUsage');
print('CPU Usage: $cpuUsage');
},
child: Text('Get Performance Data'),
),
),
),
);
}
}