Flutter外部存储文本文件读写异常:无法保存API用户信息
问题:Flutter用户信息无法保存到本地文件
我需要将API获取的用户信息(CompanyID、apiURL、CompanyName)逐行保存到本地存储,实现应用二次启动时无需重新登录——系统会检查文件是否存在,存在则读取并跳转至仪表盘页面。但调用以下代码后,信息未成功保存到外部存储:
await StorageHelper.writeTextToFile( "custInfo.txt", '\n${ApiSetting.CompanyID}' '\n${ApiSetting.apiURL}' '\n${ApiSetting.CompanyName}');
我的StorageHelper类代码如下:
import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:path_provider/path_provider.dart'; class StorageHelper{ static Future<String> get _localPath async{ final directory = await getApplicationDocumentsDirectory(); return directory.path; } static Future<File> _getLocalFile(String fileName) async{ final localPath = await _localPath; return File("$localPath/$fileName"); } static Future<File> writeTextToFile(String fileName, String text) async{ final file = await _getLocalFile(fileName); return file.writeAsString(text); } static Future<String> readFromFile(String fileName) async{ try{ }catch(e){ return ""; } final file = await _getLocalFile(fileName); return file.readAsString(); } static Future<File> writeBytesToFile(String fileName, Uint8List data) async{ final file = await _getLocalFile(fileName); return file.writeAsBytes(data); } }
问题排查与修复
1. readFromFile方法逻辑错误
readFromFile的try块为空,实际读取代码在try/catch外部,会导致文件不存在时直接抛出异常,而非返回空字符串,容易让你误以为文件未写入。
2. 未验证写入内容有效性
如果ApiSetting中的变量为空,写入的文件只会是空行,看起来像未写入,需要确保这些变量有实际值。
3. 缺少文件存在性检查方法
启动时需要判断文件是否存在,原类中没有对应方法,增加该方法能更便捷地实现登录状态判断。
修复后的StorageHelper代码
import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:path_provider/path_provider.dart'; class StorageHelper{ static Future<String> get _localPath async{ final directory = await getApplicationDocumentsDirectory(); return directory.path; } static Future<File> _getLocalFile(String fileName) async{ final localPath = await _localPath; return File("$localPath/$fileName"); } static Future<File> writeTextToFile(String fileName, String text) async{ final file = await _getLocalFile(fileName); // 若需追加内容而非覆盖,可添加参数:mode: FileMode.append return file.writeAsString(text); } static Future<String> readFromFile(String fileName) async{ try{ final file = await _getLocalFile(fileName); if(await file.exists()){ return file.readAsString(); } return ""; }catch(e){ debugPrint("读取文件失败: $e"); return ""; } } static Future<File> writeBytesToFile(String fileName, Uint8List data) async{ final file = await _getLocalFile(fileName); return file.writeAsBytes(data); } // 新增:检查文件是否存在的方法,用于启动时判断登录状态 static Future<bool> fileExists(String fileName) async{ final file = await _getLocalFile(fileName); return file.exists(); } }
调用优化建议
- 写入前验证内容有效性:
// 确保要保存的信息不为空再写入 if(ApiSetting.CompanyID.isNotEmpty && ApiSetting.apiURL.isNotEmpty && ApiSetting.CompanyName.isNotEmpty){ await StorageHelper.writeTextToFile( "custInfo.txt", '${ApiSetting.CompanyID}\n${ApiSetting.apiURL}\n${ApiSetting.CompanyName}' ); }
- 启动时检查并读取信息:
void checkLoginStatus() async{ bool hasSavedInfo = await StorageHelper.fileExists("custInfo.txt"); if(hasSavedInfo){ String content = await StorageHelper.readFromFile("custInfo.txt"); List<String> info = content.split("\n"); if(info.length >=3){ ApiSetting.CompanyID = info[0]; ApiSetting.apiURL = info[1]; ApiSetting.CompanyName = info[2]; // 跳转至仪表盘页面 // Navigator.pushReplacement(context, MaterialPageRoute(builder: (ctx) => DashboardPage())); } }else{ // 跳转至登录页面 } }
内容的提问来源于stack exchange,提问作者Aqilah Mokhtarudin
相关产品推荐
相关产品推荐

