Flutter数据持久化插件simple_json_persistence的使用

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

Flutter数据持久化插件simple_json_persistence的使用

simple_json_persistence 是一个基于简单JSON文件的Flutter数据存储插件。它完全用Dart编写,无需与原生iOS/Android代码进行通信,并支持多种存储类型。下面是如何使用这个插件的详细指南。

主要特点

  1. 纯Dart实现:不需要与原生代码交互。
  2. 多存储支持:可以为不同类型的数据创建多个存储。
  3. 适合中等规模数据集:适用于不适合使用SharedPreferences但又不想使用复杂数据库的场景。

开始使用

1. 创建数据模型

首先,你需要创建一个数据模型,并实现从JSON到对象和从对象到JSON的转换。这里推荐使用built_valuejson_serializable库来简化这一过程。

import 'package:simple_json_persistence/simple_json_persistence.dart';

[@JsonSerializable](/user/JsonSerializable)(nullable: false)
class MyModel {
  MyModel({required this.property});

  factory MyModel.fromJson(Map<String, dynamic> json) => _$MyModelFromJson(json);

  Map<String, dynamic> toJson() => _$MyModelToJson(this);

  final String property;
}

2. 初始化存储并保存/加载数据

接下来,初始化SimpleJsonPersistence实例,并保存或加载数据。

void doSomething() async {
  // 初始化存储
  final store = SimpleJsonPersistence.forType(
    (json) => MyModel.fromJson(json),
    name: 'MyModel',
  );

  // 保存数据
  await store.save(MyModel(property: 'foo'));

  // 加载数据
  final foo = await store.load();

  // 监听值变化
  store.onValueChanged.listen((newValue) {
    print('got a new value $newValue');
  });
}

在Flutter应用中使用(StreamBuilder)

你可以将SimpleJsonPersistenceStreamBuilder结合使用,以便在数据变化时自动更新UI。

Widget build(BuildContext context) {
  final store = SimpleJsonPersistence.forType(
      (json) => AppData.fromJson(json),
      defaultCreator: () => AppData(counter: 0));

  return StreamBuilder<AppData>(
    stream: store.onValueChangedAndLoad,
    initialData: store.cachedValue,
    builder: (context, snapshot) => Text('Counter: ${snapshot.data?.counter ?? 'Loading'}'),
  );
}

完整示例

以下是一个完整的示例,展示了如何在一个简单的计数器应用中使用simple_json_persistence

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

// 数据模型
[@JsonSerializable](/user/JsonSerializable)(nullable: false)
class AppData {
  AppData({required this.counter});

  factory AppData.fromJson(Map<String, dynamic> json) => _$AppDataFromJson(json);
  Map<String, dynamic> toJson() => _$AppDataToJson(this);

  final int counter;
}

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const SimpleCounter(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final store = SimpleJsonPersistence.getForTypeSync(
      (json) => AppData.fromJson(json),
      defaultCreator: () => AppData(counter: 0),
      name: 'AppData',
    );

    return StreamBuilder<AppData?>(
        stream: store.onValueChangedAndLoad,
        initialData: store.cachedValue,
        builder: (context, snapshot) {
          final data = snapshot.data;
          return Scaffold(
            appBar: AppBar(title: const Text('SimpleJsonPersistence Example')),
            body: Center(
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: data == null
                      ? <Widget>[const Center(child: CircularProgressIndicator())]
                      : <Widget>[
                          const Text(
                            'You have pushed the button:',
                            textAlign: TextAlign.center,
                          ),
                          Row(
                            mainAxisSize: MainAxisSize.min,
                            children: <Widget>[
                              Text(
                                '${data.counter}',
                                style: Theme.of(context).textTheme.headlineSmall,
                              ),
                              const Text(' times')
                            ],
                          ),
                          const SizedBox(height: 32),
                          const Text(
                            'Value will be persisted on every touch, so feel free to restart the app at any time.',
                            textScaler: TextScaler.linear(0.75),
                            textAlign: TextAlign.center,
                          ),
                        ],
                ),
              ),
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: () => store.save(AppData(counter: (data?.counter ?? 0) + 1)),
              tooltip: 'Increment',
              child: const Icon(Icons.add),
            ),
          );
        });
  }
}

更多关于Flutter数据持久化插件simple_json_persistence的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据持久化插件simple_json_persistence的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用simple_json_persistence插件进行数据持久化的示例代码。simple_json_persistence是一个简单且易于使用的Flutter插件,用于将数据保存为JSON文件到本地存储中。

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

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

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

接下来,你可以按照以下步骤在你的Flutter应用中使用simple_json_persistence进行数据持久化:

  1. 导入依赖

在你的Dart文件中导入simple_json_persistence包:

import 'package:simple_json_persistence/simple_json_persistence.dart';
  1. 创建持久化实例

创建一个SimpleJsonPersistence实例,指定存储数据的目录和文件名:

final _persistence = SimpleJsonPersistence(
  storageDirectory: (await getApplicationDocumentsDirectory()).path,
  fileName: 'data.json',
);
  1. 保存数据

使用save方法将数据存储为JSON格式:

Map<String, dynamic> data = {
  'name': 'John Doe',
  'age': 30,
  'email': 'john.doe@example.com',
};

await _persistence.save(data);
  1. 加载数据

使用load方法从JSON文件中加载数据:

Map<String, dynamic>? loadedData = await _persistence.load();

if (loadedData != null) {
  print('Loaded Data: ${loadedData}');
} else {
  print('No data found.');
}
  1. 删除数据

使用delete方法删除存储的数据文件:

await _persistence.delete();

以下是一个完整的示例,展示了如何在Flutter应用中初始化SimpleJsonPersistence实例,保存、加载和删除数据:

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:simple_json_persistence/simple_json_persistence.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late SimpleJsonPersistence _persistence;

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

  Future<void> initPersistence() async {
    _persistence = SimpleJsonPersistence(
      storageDirectory: (await getApplicationDocumentsDirectory()).path,
      fileName: 'data.json',
    );
  }

  Future<void> saveData() async {
    Map<String, dynamic> data = {
      'name': 'John Doe',
      'age': 30,
      'email': 'john.doe@example.com',
    };
    await _persistence.save(data);
    print('Data saved.');
  }

  Future<void> loadData() async {
    Map<String, dynamic>? loadedData = await _persistence.load();

    if (loadedData != null) {
      print('Loaded Data: ${loadedData}');
    } else {
      print('No data found.');
    }
  }

  Future<void> deleteData() async {
    await _persistence.delete();
    print('Data deleted.');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Simple Json Persistence Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: saveData,
                child: Text('Save Data'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: loadData,
                child: Text('Load Data'),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: deleteData,
                child: Text('Delete Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,有三个按钮分别用于保存、加载和删除数据。每个按钮点击时都会调用相应的方法来执行数据持久化操作。

回到顶部