面试题答案
一键面试实现思路
- 缓存数据:在内存或本地存储中缓存获取到的数据。可以使用
Map
在内存中简单缓存,对于需要持久化的缓存,可使用shared_preferences
插件。 - 状态管理:利用
Provider
管理应用状态,在状态类中添加缓存数据的字段和方法,用于获取缓存数据以及更新缓存。 - 请求判断:每次请求数据前,先检查缓存中是否有对应的数据,如果有则直接使用缓存数据,避免网络请求。
关键代码片段
- 定义状态类
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class DataProvider with ChangeNotifier {
Map<String, dynamic> _cache = {};
Future<Map<String, dynamic>> fetchData(String url) async {
if (_cache.containsKey(url)) {
return _cache[url];
}
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
final data = json.decode(response.body);
_cache[url] = data;
notifyListeners();
return data;
} else {
throw Exception('Failed to load data');
}
}
}
- 在Widget中使用
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Data Fetching'),
),
body: FutureBuilder<Map<String, dynamic>>(
future: Provider.of<DataProvider>(context).fetchData('https://example.com/api/data'),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
return Text('Data: ${snapshot.data}');
}
},
),
);
}
}
- 初始化Provider
import 'package:flutter/material.dart';
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => DataProvider(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyHomePage(),
);
}
}
以上代码通过DataProvider
类在内存中缓存数据,并通过Provider
提供给Widget使用,每次请求前先检查缓存,避免不必要的网络请求。如果需要持久化缓存,可在DataProvider
类中结合shared_preferences
插件进行数据的读写操作。