Flutter中如何持久化API URL修改,重启后读取最新值?
Flutter 实现API URL的持久化存储(类似C# Properties.settings)
对于你的需求,核心是通过本地持久化存储保存修改后的API URL,确保App重启后能读取到最新值。下面给你推荐两种实用方案,优先第一种,简单易上手:
方案一:使用shared_preferences(轻量键值对存储)
这是Flutter官方推荐的轻量存储方案,专门用来保存字符串、数字这类简单数据,完全满足你存储API URL的需求。
步骤1:添加依赖
在项目根目录的pubspec.yaml文件中添加依赖:
dependencies: flutter: sdk: flutter shared_preferences: ^2.2.2 # 版本号可替换为pub.dev最新版本
执行flutter pub get完成依赖安装。
步骤2:封装存储工具类
新建api_storage.dart文件,封装读写API URL的方法,方便全局调用:
import 'package:shared_preferences/shared_preferences.dart'; class ApiStorage { // 定义统一的存储键名,避免拼写错误 static const String _apiUrlKey = 'api_url'; // 保存API URL到本地 static Future<void> saveApiUrl(String url) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_apiUrlKey, url); } // 获取API URL,无存储值时返回默认值(比如你说的初始值x) static Future<String> getApiUrl({String defaultValue = 'x'}) async { final prefs = await SharedPreferences.getInstance(); return prefs.getString(_apiUrlKey) ?? defaultValue; } }
步骤3:实际使用
- 修改API URL时调用保存方法:
// 用户修改完成后,传入新的URL(比如y)执行保存 await ApiStorage.saveApiUrl('y');
- App启动时读取最新API URL:
// 在网络请求工具初始化或首页初始化时调用 String currentApiUrl = await ApiStorage.getApiUrl(); // 后续用currentApiUrl作为请求的基础地址
方案二:使用flutter_secure_storage(加密存储)
如果你的API URL包含敏感信息(比如带密钥的地址),可以用这个加密存储插件,用法和shared_preferences类似,但会对数据加密,安全性更高。
步骤1:添加依赖
dependencies: flutter: sdk: flutter flutter_secure_storage: ^9.0.0
执行flutter pub get完成安装。
步骤2:封装工具类
import 'package:flutter_secure_storage/flutter_secure_storage.dart'; class SecureApiStorage { static const String _apiUrlKey = 'api_url'; static final _storage = FlutterSecureStorage(); // 保存加密后的API URL static Future<void> saveApiUrl(String url) async { await _storage.write(key: _apiUrlKey, value: url); } // 获取加密存储的API URL static Future<String> getApiUrl({String defaultValue = 'x'}) async { String? url = await _storage.read(key: _apiUrlKey); return url ?? defaultValue; } }
使用方式和方案一完全一致,仅工具类不同。
注意事项
- 首次启动App时,因无存储值会返回你设置的默认值(比如示例中的'x')
- 所有存储操作都是异步的,必须用
await处理 - 如果后续需要管理多个配置项,可以考虑
hive或isar这类轻量NoSQL数据库,但单个API URL用上述方案足够轻便
内容的提问来源于stack exchange,提问作者Ahmet Enes Söylemez
相关产品推荐
相关产品推荐

