面试题答案
一键面试1. 存储路径获取
- iOS:使用
path_provider
库获取应用文档目录,此目录用于存储用户数据,应用卸载时数据会被删除。代码示例:
import 'package:path_provider/path_provider.dart';
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
- Android:同样使用
path_provider
库获取应用文档目录。不同的是,Android 有内部存储和外部存储概念。对于需要持久存储且用户可能需要访问的数据,可考虑外部存储(需申请权限)。获取内部存储文档目录代码示例:
import 'package:path_provider/path_provider.dart';
Future<String> get _localPath async {
final directory = await getApplicationDocumentsDirectory();
return directory.path;
}
获取外部存储目录(需申请 READ_EXTERNAL_STORAGE
和 WRITE_EXTERNAL_STORAGE
权限):
import 'package:path_provider/path_provider.dart';
Future<String> get _externalPath async {
final directory = await getExternalStorageDirectory();
return directory!.path;
}
2. 性能优化
- 缓存策略:在频繁读取的情况下,使用内存缓存。例如,使用
flutter_cache_manager
库。先从缓存中读取数据,如果没有再从存储路径读取。
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
final cacheManager = CacheManager(
Config(
'customCacheKey',
stalePeriod: const Duration(days: 7),
),
);
Future<File?> getFileFromCache(String url) async {
final fileInfo = await cacheManager.getFileFromCache(url);
return fileInfo?.file;
}
- 批量操作:避免频繁的小文件读写操作,尽量进行批量读写。例如,将多个小数据合并成一个文件存储,读取时一次性读取整个文件,再进行解析。
3. 数据安全
- 加密存储:使用
encrypt
库对存储的数据进行加密。在写入文件前加密数据,读取文件后解密数据。
import 'package:encrypt/encrypt.dart';
// 初始化密钥和IV
final key = Key.fromUtf8('my 32 length key................');
final iv = IV.fromLength(16);
// 加密数据
String encryptData(String data) {
final encrypter = Encrypter(AES(key));
final encrypted = encrypter.encrypt(data, iv: iv);
return encrypted.base64;
}
// 解密数据
String decryptData(String encryptedData) {
final encrypter = Encrypter(AES(key));
final decrypted = encrypter.decrypt64(encryptedData, iv: iv);
return decrypted;
}
- 权限管理:在 Android 上,只申请必要的存储权限,并且在不需要时及时释放权限。例如,在 AndroidManifest.xml 中配置权限,并在代码中动态申请:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
import 'package:permission_handler/permission_handler.dart';
Future<bool> requestStoragePermission() async {
if (await Permission.storage.request().isGranted) {
return true;
}
return false;
}
4. 兼容性保证
通过使用 path_provider
这样跨平台的库,Flutter 可以在 iOS 和 Android 上以统一的方式获取存储路径。同时,在代码逻辑中,根据不同平台的特点进行针对性处理,如权限管理(Android 特有),确保应用在不同平台上都能正常运行。在存储数据格式上,采用通用的格式,如 JSON,以便在不同平台上都能轻松解析和处理。