Flutter没有网络时如何进行数据存储

在Flutter应用中,当设备没有网络连接时,有哪些可靠的方法可以实现数据存储?我想了解如何本地保存用户输入的数据,并在网络恢复后同步到服务器。能否推荐一些适合离线存储的包或技术方案,比如SQLite、Hive或shared_preferences?这些方案各有什么优缺点?另外,如何处理数据冲突和同步问题?

2 回复

Flutter无网络时,可使用本地存储方案:

  1. shared_preferences:存储键值对数据。
  2. SQLite:通过sqflite插件管理结构化数据。
  3. Hive:轻量级NoSQL数据库,性能高。
  4. 文件存储:使用dart:io读写本地文件。

数据可先缓存在本地,待网络恢复后同步到服务器。

更多关于Flutter没有网络时如何进行数据存储的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,当没有网络连接时,可以通过以下方式进行数据存储:

1. Shared Preferences

适合存储少量简单数据(如用户设置、登录状态等)

import 'package:shared_preferences/shared_preferences.dart';

// 存储数据
Future<void> saveData(String key, String value) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString(key, value);
}

// 读取数据
Future<String?> getData(String key) async {
  final prefs = await SharedPreferences.getInstance();
  return prefs.getString(key);
}

2. SQLite数据库

适合存储结构化数据

import 'package:sqflite/sqflite.dart';

class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper._internal();
  factory DatabaseHelper() => _instance;
  
  static Database? _database;
  
  Future<Database> get database async {
    _database ??= await _initDatabase();
    return _database!;
  }
  
  Future<Database> _initDatabase() async {
    return openDatabase(
      'my_database.db',
      version: 1,
      onCreate: (db, version) async {
        await db.execute('''
          CREATE TABLE users(
            id INTEGER PRIMARY KEY,
            name TEXT,
            email TEXT
          )
        ''');
      },
    );
  }
}

3. Hive

轻量级、高性能的键值数据库

import 'package:hive/hive.dart';

class HiveService {
  static Future<void> init() async {
    await Hive.initFlutter();
    await Hive.openBox('myBox');
  }
  
  static Future<void> saveData(String key, dynamic value) async {
    var box = Hive.box('myBox');
    await box.put(key, value);
  }
  
  static dynamic getData(String key) {
    var box = Hive.box('myBox');
    return box.get(key);
  }
}

4. 文件存储

适合存储大文件或自定义格式数据

import 'dart:io';
import 'package:path_provider/path_provider.dart';

Future<File> getLocalFile(String filename) async {
  final directory = await getApplicationDocumentsDirectory();
  return File('${directory.path}/$filename');
}

Future<void> writeToFile(String data) async {
  final file = await getLocalFile('data.txt');
  await file.writeAsString(data);
}

Future<String> readFromFile() async {
  try {
    final file = await getLocalFile('data.txt');
    return await file.readAsString();
  } catch (e) {
    return '';
  }
}

推荐方案

  • 简单配置数据:使用Shared Preferences
  • 结构化数据:使用SQLite或Hive
  • 大文件:使用文件存储

当网络恢复后,可以通过同步机制将本地数据上传到服务器。

回到顶部