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

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

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

Migration Shared Preferences

这个插件是shared_preferences包的一个副本,但没有在键前添加前缀。它用于从以前的原生应用程序迁移数据。

问题在于Flutter在读取和写入时会给键添加一个前缀。因此我们无法读取旧的键。 此外,对于Android,您现在可以在android/app/src/main/res/values/strings.xml中指定资源文件的名称:

<resources>
    ...
    <string name="flutter_shared_pref_name">resource_name</string>
    ...
</resources>

ISSUE

只有在需要从以前的原生应用版本获取共享首选项时才使用此插件。其他情况下请使用官方的shared_preferences包。

要管理迁移,请使用此软件包 version_migration

Installation

pubspec.yaml中添加:

native_shared_preferences: ^2.0.10

Usage

要使用此插件,只需在pubspec.yaml文件中添加native_shared_preferences

Example

下面是一个完整的示例demo,演示了如何使用native_shared_preferences来保存和读取计数器的值,并且展示了如何在应用程序重启后保持这些值。

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:native_shared_preferences/native_shared_preferences.dart';

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

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

class SharedPreferencesDemo extends StatefulWidget {
  SharedPreferencesDemo({Key? key}) : super(key: key);

  @override
  SharedPreferencesDemoState createState() => SharedPreferencesDemoState();
}

class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  Future<NativeSharedPreferences> _prefs = NativeSharedPreferences.getInstance();
  Future<int>? _counter;

  Future<void> _incrementCounter() async {
    final NativeSharedPreferences prefs = await _prefs;
    final int counter = (prefs.getInt('counter') ?? 0) + 1;

    setState(() {
      _counter = prefs.setInt("counter", counter).then((bool success) {
        return counter;
      });
    });
  }

  void _resetCounter() async {
    final NativeSharedPreferences prefs = await _prefs;

    setState(() {
      _counter = prefs.setInt("counter", null).then((bool success) => 0);
    });
  }

  @override
  void initState() {
    super.initState();
    _counter = _prefs.then((NativeSharedPreferences prefs) {
      return (prefs.getInt('counter') ?? 0);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("NativeSharedPreferences Demo"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            FutureBuilder<int>(
              future: _counter,
              builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.waiting:
                    return const CircularProgressIndicator();
                  default:
                    if (snapshot.hasError) {
                      return Text('Error: ${snapshot.error}');
                    } else {
                      return Text(
                        'Button tapped ${snapshot.data} time${snapshot.data == 1 ? '' : 's'}.\n\n'
                        'This should persist across restarts.',
                      );
                    }
                }
              },
            ),
            ElevatedButton(
              onPressed: _resetCounter,
              child: Text('Reset'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

Testing

您可以通过运行以下代码在测试中为NativeSharedPreferences填充初始值:

NativeSharedPreferences.setMockInitialValues(Map<String, dynamic> values);

通过上述内容,您可以了解如何在Flutter项目中使用native_shared_preferences插件进行本地数据存储,并确保数据能够在应用重启后仍然存在。


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

1 回复

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


当然,以下是如何在Flutter项目中使用native_shared_preferences插件进行本地数据存储的示例代码。请注意,native_shared_preferences是一个常见的Flutter插件,用于在设备的本地存储中读写简单的键值对数据。然而,更常见和官方维护的插件是shared_preferences。由于native_shared_preferences可能不是官方插件,下面的示例将基于shared_preferences插件,因为两者的使用方式非常相似。如果你确实需要使用native_shared_preferences,请确保在pubspec.yaml文件中正确添加依赖并参考其文档。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加shared_preferences依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15  # 请检查最新版本号

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

2. 导入插件

在你的Dart文件中导入shared_preferences插件:

import 'package:shared_preferences/shared_preferences.dart';

3. 使用SharedPreferences进行数据存储和读取

下面是一个完整的示例,展示了如何使用SharedPreferences来存储和读取数据:

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;
  String? _name = '';

  @override
  void initState() {
    super.initState();
    _initializePreferences().then((_) {
      // 读取存储的数据
      setState(() {
        _name = _preferences.getString('name');
      });
    });
  }

  Future<void> _initializePreferences() async {
    _preferences = await SharedPreferences.getInstance();
  }

  Future<void> _saveName(String name) async {
    setState(() {
      _name = name;
    });
    await _preferences.setString('name', name);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Enter your name'),
              onChanged: (value) {
                _saveName(value);
              },
            ),
            SizedBox(height: 16),
            Text('Stored name: $_name'),
          ],
        ),
      ),
    );
  }
}

解释

  1. 添加依赖:在pubspec.yaml中添加shared_preferences依赖。
  2. 导入插件:在Dart文件中导入shared_preferences
  3. 初始化SharedPreferences:在initState方法中调用SharedPreferences.getInstance()来初始化_preferences对象。
  4. 存储数据:使用_preferences.setString('key', 'value')来存储数据。
  5. 读取数据:使用_preferences.getString('key')来读取数据。

这个示例展示了如何在Flutter应用中使用SharedPreferences来存储和读取用户的名字。你可以根据需要修改这个示例来存储和读取其他类型的数据(如整数、布尔值等)。如果你确实需要使用native_shared_preferences,请确保按照其文档进行相应的修改。

回到顶部