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

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

在Flutter开发中,shared_preferences 是一个非常常用的插件,用于存储简单的键值对数据。它可以将数据保存到设备的共享偏好设置中,适合存储一些简单的配置信息或用户偏好设置。

添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15 # 确保版本是最新的

然后运行以下命令以安装依赖:

flutter pub get

使用示例

下面是一个完整的示例,演示如何使用 shared_preferences 来存储和读取数据。

1. 导入库

在需要使用的文件中导入 shared_preferences 库:

import 'package:shared_preferences/shared_preferences.dart';

2. 存储数据

我们可以使用 SharedPreferences 类来存储数据。例如,存储一个布尔值、字符串和整数值。

void saveData() async {
  // 获取 SharedPreferences 实例
  SharedPreferences prefs = await SharedPreferences.getInstance();

  // 存储布尔值
  await prefs.setBool('isUserLoggedIn', true);

  // 存储字符串
  await prefs.setString('username', 'JohnDoe');

  // 存储整数
  await prefs.setInt('age', 25);
}

3. 读取数据

SharedPreferences 中读取之前存储的数据:

Future<void> loadData() async {
  // 获取 SharedPreferences 实例
  SharedPreferences prefs = await SharedPreferences.getInstance();

  // 读取布尔值
  bool isUserLoggedIn = prefs.getBool('isUserLoggedIn') ?? false;

  // 读取字符串
  String username = prefs.getString('username') ?? 'Unknown';

  // 读取整数
  int age = prefs.getInt('age') ?? 0;

  print('是否登录: $isUserLoggedIn');
  print('用户名: $username');
  print('年龄: $age');
}

4. 删除数据

如果需要删除某个键值对,可以使用 remove 方法:

void removeData() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.remove('isUserLoggedIn'); // 删除布尔值
  prefs.remove('username');       // 删除字符串
  prefs.remove('age');           // 删除整数
}

完整示例代码

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SharedPrefsExample(),
    );
  }
}

class SharedPrefsExample extends StatefulWidget {
  [@override](/user/override)
  _SharedPrefsExampleState createState() => _SharedPrefsExampleState();
}

class _SharedPrefsExampleState extends State<SharedPrefsExample> {
  bool _isLoggedIn = false;
  String _username = '';
  int _age = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _loadUserData();
  }

  Future<void> _loadUserData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _isLoggedIn = prefs.getBool('isUserLoggedIn') ?? false;
      _username = prefs.getString('username') ?? 'Unknown';
      _age = prefs.getInt('age') ?? 0;
    });
  }

  Future<void> _saveData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setBool('isUserLoggedIn', _isLoggedIn);
    await prefs.setString('username', _username);
    await prefs.setInt('age', _age);
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('数据已保存')));
  }

  Future<void> _clearData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.clear();
    setState(() {
      _isLoggedIn = false;
      _username = 'Unknown';
      _age = 0;
    });
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text('数据已清除')));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences 示例'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              decoration: InputDecoration(labelText: '用户名'),
              onChanged: (value) => setState(() => _username = value),
            ),
            SizedBox(height: 10),
            TextField(
              keyboardType: TextInputType.number,
              decoration: InputDecoration(labelText: '年龄'),
              onChanged: (value) => setState(() => _age = int.tryParse(value) ?? 0),
            ),
            SizedBox(height: 10),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                ElevatedButton(
                  onPressed: _saveData,
                  child: Text('保存数据'),
                ),
                ElevatedButton(
                  onPressed: _clearData,
                  child: Text('清除数据'),
                ),
              ],
            ),
            SizedBox(height: 20),
            Text('是否登录: $_isLoggedIn'),
            Text('用户名: $_username'),
            Text('年龄: $_age'),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


在 Flutter 中,shared_preferences 是一个非常常用的插件,用于在本地存储简单的键值对数据。它可以用来存储一些轻量级的数据,比如用户偏好设置、登录状态等。下面是如何使用 shared_preferences 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 shared_preferences 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.6

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

2. 导入插件

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

import 'package:shared_preferences/shared_preferences.dart';

3. 使用 SharedPreferences

SharedPreferences 是一个单例对象,你可以通过 SharedPreferences.getInstance() 获取它的实例。

存储数据

你可以使用以下方法来存储不同类型的数据:

  • setBool(String key, bool value)
  • setInt(String key, int value)
  • setDouble(String key, double value)
  • setString(String key, String value)
  • setStringList(String key, List<String> value)
Future<void> saveData() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setInt('counter', 10);
  await prefs.setString('name', 'John Doe');
  await prefs.setBool('isLoggedIn', true);
}

读取数据

你可以使用以下方法来读取存储的数据:

  • getBool(String key)
  • getInt(String key)
  • getDouble(String key)
  • getString(String key)
  • getStringList(String key)
Future<void> readData() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  int? counter = prefs.getInt('counter');
  String? name = prefs.getString('name');
  bool? isLoggedIn = prefs.getBool('isLoggedIn');

  print('Counter: $counter');
  print('Name: $name');
  print('Is Logged In: $isLoggedIn');
}

删除数据

你可以使用 remove(String key) 方法来删除某个键值对。

Future<void> removeData() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.remove('counter');
}

清除所有数据

你可以使用 clear() 方法来清除所有存储的数据。

Future<void> clearData() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.clear();
}

4. 示例代码

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

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SharedPreferencesExample(),
    );
  }
}

class SharedPreferencesExample extends StatefulWidget {
  [@override](/user/override)
  _SharedPreferencesExampleState createState() => _SharedPreferencesExampleState();
}

class _SharedPreferencesExampleState extends State<SharedPreferencesExample> {
  int _counter = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _loadCounter();
  }

  Future<void> _loadCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = prefs.getInt('counter') ?? 0;
    });
  }

  Future<void> _incrementCounter() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0) + 1;
      prefs.setInt('counter', _counter);
    });
  }

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