Flutter存储检查插件storage_inspector的使用

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

Flutter存储检查插件storage_inspector的使用

简介

Flutter local storage inspector 是一个允许开发者在运行时检查应用程序本地存储的库。在开发过程中,您可以使用 IntelliJ 基础 IDE 的 “Local storage inspector” 插件来检查和修改应用程序的本地文件、数据库、模型等。

pub package pub points IntelliJ Plugin

主要特性

  • SharedPreferences 插件
  • Secure Storage 插件
  • 基于 dart:io 的本地文件插件
  • Drift 数据库插件

快速开始

创建 StorageServerDriver

首先,创建一个 StorageServerDriver 实例,用于管理本地存储服务器:

final driver = StorageServerDriver(
  bundleId: 'com.example.test', // 用于标识
  port: 0, // 默认为0,表示自动选择空闲端口
  icon: '...', // 可选图标,用于视觉识别。可以是 Base64 编码的 PNG 或纯 SVG 字符串
);

添加服务器

接下来,注册您希望暴露的各个服务器。这些服务器作为插件包提供:

示例代码如下:

final preferences = await SharedPreferences.getInstance();
final secureStorage = const FlutterSecureStorage();

final preferencesServer =
    PreferencesKeyValueServer(preferences, 'Base Preferences');

final secureStorageServer =
    SecureStorageKeyValueServer(secureStorage, 'Super secret storage');

final fileServer = DefaultFileServer(await _documentsDirectory(), "Cache files");

driver.addKeyValueServer(preferencesServer);
driver.addKeyValueServer(secureStorageServer);
driver.addFileServer(fileServer);

Future<String> _documentsDirectory() async {
  if (kIsWeb) return '.';
  return (await getApplicationDocumentsDirectory()).path;
}

启动 Inspector

配置完成后,启动驱动程序以启动 Inspector 和插件的公告服务器:

await driver.start();

关闭 Inspector

如果需要关闭服务器,可以调用:

await driver.stop();

高级用法

暂停

如果您希望在应用程序完全启动之前对某些本地存储进行操作,可以在启动驱动程序时传递 paused: true 参数。这将确保 await driver.start(paused: true) 只有在 Inspector 插件/API 发送 resume 信号后才返回。服务器在接收到此信号之前仍然会处理请求,允许您动态更改初始值。

await driver.start(paused: true);

自定义集成

为了编写自己的系统集成(例如:修改纯内存键值存储),只需实现最符合您需求的正确服务器接口即可。

abstract class KeyValueServer{} // 最通用的键值服务器,支持任意键和值类型

abstract class SimpleKeyValueServer{} // 更简单的键值服务器变体,仅支持字符串键和值

abstract class FileServer{} // 服务分层存储二进制数据的服务器

完整示例代码

下面是一个完整的示例代码,展示了如何使用 storage_inspector 插件:

import 'package:file_local_storage_inspector/file_local_storage_inspector.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:path_provider/path_provider.dart';
import 'package:preferences_local_storage_inspector/preferences_local_storage_inspector.dart';
import 'package:secure_storage_local_storage_inspector/secure_storage_local_storage_inspector.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:storage_inspector/storage_inspector.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // ignore: avoid_print
  storageInspectorLogger = (e) => print(e);

  final preferences = await SharedPreferences.getInstance();

  final driver = StorageServerDriver(
    bundleId: 'com.example.test',
    icon: '<some icon>',
  );
  final keyValueServer =
      PreferencesKeyValueServer(preferences, 'Preferences', keySuggestions: {
    const ValueWithType(StorageType.string, 'testBool'),
    const ValueWithType(StorageType.string, 'testInt'),
    const ValueWithType(StorageType.string, 'testFloat'),
  });
  driver.addKeyValueServer(keyValueServer);

  final secureKeyValueServer = SecureStorageKeyValueServer(
      const FlutterSecureStorage(), 'Preferences',
      keySuggestions: {
        'testBool',
        'testInt',
        'testFloat',
      });
  driver.addKeyValueServer(secureKeyValueServer);

  final fileServer =
      DefaultFileServer(await _documentsDirectory(), 'App Documents');
  driver.addFileServer(fileServer);

  // Don't wait for a connection from the instrumentation driver
  await driver.start(paused: false);

  // run app
  runApp(const MyApp());

  await driver.stop(); // Optional when main ends
}

Future<String> _documentsDirectory() async {
  if (kIsWeb) return '.';
  return (await getApplicationDocumentsDirectory()).path;
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

通过以上步骤,您可以在开发过程中轻松地检查和调试 Flutter 应用程序的本地存储。希望这对您有所帮助!


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用storage_inspector插件来检查存储的示例代码和步骤。storage_inspector插件允许你在Flutter应用中方便地检查和修改本地存储(如SharedPreferences、SQLite等)的数据。

步骤 1:添加依赖

首先,你需要在pubspec.yaml文件中添加storage_inspector依赖:

dependencies:
  flutter:
    sdk: flutter
  storage_inspector: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来获取依赖。

步骤 2:配置应用

在你的main.dart文件中,你需要进行一些配置来启用storage_inspector

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

void main() {
  // 初始化StorageInspector
  StorageInspector.init(
    // 如果需要,你可以传递自定义的StorageInspectorOptions
    // 例如:StorageInspectorOptions(enabled: true, ...)
  );

  runApp(MyApp());
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 示例:使用SharedPreferences存储数据
  final SharedPreferences _preferences = await SharedPreferences.getInstance();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Storage Inspector Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${_preferences.getInt('counter') ?? 0}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  void _incrementCounter() {
    setState(() {
      // 更新SharedPreferences中的值
      _preferences.setInt('counter', (_preferences.getInt('counter') ?? 0) + 1);
    });
  }
}

步骤 3:运行应用并连接Storage Inspector

  1. 运行你的Flutter应用。
  2. 打开Chrome DevTools(通常可以通过chrome://inspect访问)。
  3. 在DevTools中找到你的Flutter应用,并点击“Inspect”按钮。
  4. 在打开的DevTools窗口中,你应该能看到一个名为“Storage Inspector”的选项卡。
  5. 点击“Storage Inspector”选项卡,你将能够查看和编辑你的应用的存储数据。

注意事项

  • 确保你的Flutter和Dart环境是最新的,以便兼容storage_inspector插件。
  • storage_inspector插件可能需要在DevTools中启用一些额外的调试选项。
  • 在生产环境中,请禁用或谨慎使用storage_inspector,因为它可能会暴露敏感信息。

通过上述步骤,你应该能够在Flutter应用中使用storage_inspector插件来方便地检查和修改存储数据。

回到顶部