Flutter本地数据存储插件shared_preferences_tools的使用

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

Flutter本地数据存储插件shared_preferences_tools的使用

shared_preferences_tools 是一个为 Flutter 的 shared_preferences 包提供的 DevTools 扩展。通过这个工具,你可以在 Flutter DevTools 中更方便地管理和操作 SharedPreferences 中的数据。

特性

  • 列出所有键:查看应用中存储的所有 SharedPreferences 键。
  • 搜索特定键:快速找到特定的键。
  • 直接编辑或删除值:对值进行编辑或删除,更改会立即反映在应用中。

支持的数据类型包括:

  • String
  • int
  • double
  • bool
  • List<String>
选择键 编辑值
选择键 编辑值

入门指南

要将此包添加到你的项目中,运行以下命令:

flutter pub add shared_preferences_tools

完成后,只需打开 Flutter DevTools 并使用 SharedPreferences 工具即可!

贡献到此包

  1. 运行示例项目(或任何依赖于 shared_preferences_tools 的项目),并复制其调试服务 URL。
  2. 通过 VSCode 或运行以下命令来运行 shared_preferences_tools_devtools_extension 项目:
flutter run -d chrome --dart-define=use_simulated_environment=true

更多详细信息,请参阅 devtools_extensions 包文档。

示例代码

以下是一个完整的示例代码,展示了如何使用 shared_preferences_toolsshared_preferences 存储和读取数据。

example/lib/main.dart

// ignore_for_file: public_member_api_docs

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:shared_preferences/shared_preferences.dart';

Future<void> _setInitialValues() async {
  WidgetsFlutterBinding.ensureInitialized();
  final SharedPreferences prefs = await SharedPreferences.getInstance();

  if (prefs.getKeys().isNotEmpty) {
    return;
  }

  final SharedPreferencesAsync asyncPrefs = SharedPreferencesAsync();

  await <Future<void>>[
    prefs.setString('someStringKey', 'Hello, world!'),
    prefs.setInt('someIntKey', 42),
    prefs.setDouble('someDoubleKey', 3.14),
    prefs.setBool('someBoolKey', true),
    prefs.setStringList(
      'someStringListKey',
      <String>['Hello World 1', 'Hello World 2'],
    ),
    asyncPrefs.setString('asyncStringKey', 'Hello, async world!'),
    asyncPrefs.setInt('asyncIntKey', 24),
    asyncPrefs.setDouble('asyncDoubleKey', 1.41),
    asyncPrefs.setBool('asyncBoolKey', false),
    asyncPrefs.setStringList(
      'asyncStringListKey',
      <String>['Hello Async World 1', 'Hello Async World 2'],
    ),
  ].wait;
}

Future<void> main() async {
  await _setInitialValues();

  runApp(const SharedPreferencesToolsExample());
}

class SharedPreferencesToolsExample extends StatelessWidget {
  const SharedPreferencesToolsExample({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Shared Preferences Tools Example',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const Scaffold(
        body: _Content(),
      ),
    );
  }
}

class _Content extends HookWidget {
  const _Content();

  @override
  Widget build(BuildContext context) {
    final SharedPreferences? prefs =
        useFuture(SharedPreferences.getInstance()).data;
    final SharedPreferencesAsync asyncPrefs =
        useMemoized(() => SharedPreferencesAsync());
    final ValueNotifier<bool> loadingState = useState(false);
    final asyncStringKey = useFuture(asyncPrefs.getString('asyncStringKey')).data;
    final asyncIntKey = useFuture(asyncPrefs.getInt('asyncIntKey')).data;
    final asyncDoubleKey = useFuture(asyncPrefs.getDouble('asyncDoubleKey')).data;
    final asyncBoolKey = useFuture(asyncPrefs.getBool('asyncBoolKey')).data;
    final asyncStringListKey = useFuture(asyncPrefs.getStringList('asyncStringListKey')).data;

    if (prefs == null || loadingState.value) {
      return const Center(
        child: CircularProgressIndicator(),
      );
    }

    return Center(
      child: ListView(
        shrinkWrap: true,
        padding: const EdgeInsets.all(16),
        children: <Widget>[
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('someStringKey: ${prefs.getString('someStringKey')}'),
              const SizedBox(height: 8),
              Text('someIntKey: ${prefs.getInt('someIntKey')}'),
              const SizedBox(height: 8),
              Text('someDoubleKey: ${prefs.getDouble('someDoubleKey')}'),
              const SizedBox(height: 8),
              Text('someBoolKey: ${prefs.getBool('someBoolKey')}'),
              const SizedBox(height: 8),
              Text(
                'someStringListKey: ${prefs.getStringList('someStringListKey')}',
              ),
              const SizedBox(height: 8),
              Text('asyncStringKey: $asyncStringKey'),
              const SizedBox(height: 8),
              Text('asyncIntKey: $asyncIntKey'),
              const SizedBox(height: 8),
              Text('asyncDoubleKey: $asyncDoubleKey'),
              const SizedBox(height: 8),
              Text('asyncBoolKey: $asyncBoolKey'),
              const SizedBox(height: 8),
              Text('asyncStringListKey: $asyncStringListKey'),
            ],
          ),
        ],
      ),
    );
  }
}

解释

  1. 初始化数据_setInitialValues 函数在应用启动时初始化一些示例数据。
  2. 主函数main 函数调用 _setInitialValues 并启动应用。
  3. 应用入口SharedPreferencesToolsExample 是应用的入口点,创建了一个 MaterialApp
  4. 内容展示_Content 组件使用 flutter_hooks 来管理状态,并展示从 SharedPreferences 中读取的数据。

通过这个示例,你可以看到如何使用 shared_preferences 存储和读取不同类型的值,并且可以通过 shared_preferences_tools 在 DevTools 中方便地管理这些数据。


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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用shared_preferences_tools插件进行本地数据存储的示例代码。shared_preferences_tools是对shared_preferences的一个封装,提供了更简洁的API来进行键值对存储。不过需要注意的是,shared_preferences_tools并不是一个官方或广泛使用的包,这里我们假设它提供了类似于shared_preferences的功能,但API更加友好。如果实际上没有这个包,你可以参考shared_preferences的用法。

首先,确保你的pubspec.yaml文件中包含了shared_preferences依赖(因为shared_preferences_tools如果存在,很可能也是基于shared_preferences的):

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15  # 请检查并使用最新版本

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

接下来,我们编写一个示例,展示如何使用shared_preferences(假设shared_preferences_tools有类似API):

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

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

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

class SharedPreferencesDemo extends StatefulWidget {
  @override
  _SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}

class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  late SharedPreferences _preferences;

  @override
  void initState() {
    super.initState();
    _initPreferences();
  }

  Future<void> _initPreferences() async {
    _preferences = await SharedPreferences.getInstance();
    // 假设有一个初始值设置
    String? initialValue = _preferences.getString('key_example');
    if (initialValue == null) {
      // 如果没有值,则设置默认值
      await _preferences.setString('key_example', 'Hello, SharedPreferences!');
    }
    setState(() {}); // 触发UI更新,虽然这里其实不需要,因为初始值读取不是UI依赖的
  }

  Future<void> _saveData() async {
    setState(() {
      // 显示一个加载指示器或者禁用按钮等,这里简化为直接调用
      _preferences.setString('key_example', 'Data has been updated!');
    });
    await _preferences.setString('key_example', 'Data has been updated!');
    // 更新UI(如果需要的话)
  }

  Future<void> _retrieveData() async {
    String value = _preferences.getString('key_example') ?? 'No Data';
    // 显示数据,这里简化为打印到控制台
    print('Retrieved value: $value');
    // 在实际应用中,你可能想要更新UI来显示这个值
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _saveData,
              child: Text('Save Data'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _retrieveData,
              child: Text('Retrieve Data'),
            ),
          ],
        ),
      ),
    );
  }
}

在上面的代码中,我们做了以下几件事:

  1. initState中初始化SharedPreferences实例。
  2. 检查并可能设置一个初始值。
  3. 提供两个按钮来保存和检索数据。
  4. 使用_preferences.setString方法来存储数据,使用_preferences.getString方法来检索数据。

请注意,如果你实际上使用的是shared_preferences_tools(假设它存在),API可能会略有不同,但核心思想是相同的:初始化、保存和检索键值对数据。你应该参考该插件的文档来获取确切的API用法。如果shared_preferences_tools不存在,上面的代码示例使用shared_preferences也可以达到相同的目的。

回到顶部