面试题答案
一键面试缓存机制
- 内存缓存:使用
InMemoryCache
来存储加载过的数据。在Flutter中,可以使用Map
来简单实现一个内存缓存。例如:
class InMemoryCache {
static final Map<String, dynamic> _cache = {};
static dynamic get(String key) => _cache[key];
static void put(String key, dynamic value) => _cache[key] = value;
}
在数据加载函数中,先检查缓存:
Future<dynamic> loadData(String key) async {
var cached = InMemoryCache.get(key);
if (cached != null) {
return cached;
}
// 从网络或本地存储加载数据
dynamic data = await _loadFromSource(key);
InMemoryCache.put(key, data);
return data;
}
Future<dynamic> _loadFromSource(String key) async {
// 模拟从网络或本地存储加载数据
await Future.delayed(Duration(seconds: 2));
return "Loaded data for $key";
}
- 磁盘缓存:对于图片等较大数据,可以使用
flutter_cache_manager
库。
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
class DiskCache {
static final CacheManager _cacheManager = CacheManager(
Config(
'customCacheKey',
stalePeriod: const Duration(days: 7),
),
);
static Future<File?> getFile(String url) async {
return _cacheManager.getSingleFile(url);
}
static Future<void> putFile(String url) async {
await _cacheManager.putFile(url);
}
}
加载图片时优先从磁盘缓存获取:
Future<ImageProvider> loadImage(String url) async {
var file = await DiskCache.getFile(url);
if (file != null) {
return FileImage(file);
}
// 从网络加载图片
await DiskCache.putFile(url);
return NetworkImage(url);
}
并发处理
- Future.wait:如果有多个异步数据加载任务,可以使用
Future.wait
来并发执行。例如同时加载图片和文本:
Future<void> loadMultipleData() async {
List<Future> tasks = [
loadImage('https://example.com/image.jpg'),
loadText('https://example.com/text.txt')
];
List results = await Future.wait(tasks);
ImageProvider image = results[0];
String text = results[1];
// 使用加载的数据
}
Future<String> loadText(String url) async {
// 模拟网络请求获取文本
await Future.delayed(Duration(seconds: 2));
return "Sample text";
}
- Isolate:对于一些CPU密集型的本地数据处理任务(如图片解码等),可以使用
Isolate
来并行处理,避免阻塞UI线程。但注意Isolate
间通信相对复杂。
多语言切换流畅性
- 预加载语言数据:在应用启动时,预先加载所有可能需要的语言数据到缓存中。
void preloadLanguages() async {
List<String> languages = ['en', 'zh', 'fr'];
for (String lang in languages) {
await loadLanguageData(lang);
}
}
Future<dynamic> loadLanguageData(String lang) async {
// 模拟加载语言数据
await Future.delayed(Duration(seconds: 2));
return {'greeting': 'Hello'};
}
- 动态更新:使用
InheritedWidget
或Provider
等状态管理工具,当语言切换时,快速更新UI而不需要重新加载整个页面。例如使用Provider
:
class LanguageProvider with ChangeNotifier {
String _currentLang = 'en';
String get currentLang => _currentLang;
void setLang(String lang) {
_currentLang = lang;
notifyListeners();
}
}
在UI中监听语言变化:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => LanguageProvider(),
child: MaterialApp(
home: Scaffold(
body: Consumer<LanguageProvider>(
builder: (context, langProvider, child) {
// 根据 langProvider.currentLang 显示相应语言的文本
return Text('Current language: ${langProvider.currentLang}');
},
),
),
),
);
}
}