我正在开发一个Flutter项目,在应用启动时我想要预缓存图片。我的想法是,当您第一次启动应用程序时,会下载一系列图像,然后将它们缓存/存储在数据库中/存储在本地存储中/或使用其他可行的解决方案。我不知道最佳实践是什么。然后,当您下次启动应用程序时,已经有了照片,因此您不需要再次下载它们(基于后端数据的版本)。根据我所看到的:
我在过去几天里尝试使用上述每种解决方案来实现此目标,但没有成功。
现在,我想将
- 缓存,我不确定是否持久化,而且我不知道我能否对其进行充分的控制。
- 本地存储,我认为我必须请求用户权限来访问设备上的文件。
- 数据库,每次保存/获取图像时都必须对其进行编码/解码,因此这将需要一些计算。
我在过去几天里尝试使用上述每种解决方案来实现此目标,但没有成功。
现在,我想将
Image
存储到数据库中(我正在使用sqflite
),并在另一个屏幕中将其作为Widget
读取以显示它。我有两个屏幕,第一个称为SplashScreen
以获取和保存图像,第二个是HomeScreen
以从数据库中读取图像并显示它们。
:class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> with SingleTickerProviderStateMixin {
bool hasInternet = true;
var subscription;
double loading = 0;
@override
initState() {
super.initState();
getPhotos();
subscription = Connectivity().onConnectivityChanged.listen((ConnectivityResult connectivityResult) {
setState(() {
hasInternet = connectivityResult == ConnectivityResult.mobile || connectivityResult == ConnectivityResult.wifi;
});
});
}
dispose() {
super.dispose();
subscription.cancel();
}
Future getPhotos() async {
List<String> photoUrls = await fetchPhotos();
photoUrls.asMap().forEach((index, photoUrl) async {
var response = await http
.get(photoUrl);
loading = index / photoUrls.length;
// Convert Photo response and save them in DB
imageDBFormat = ...
savePhotosInDB(imageDBFormat)
});
}
@override
Widget build(BuildContext context) {
if(loading == 1) {
Navigator.pushNamed(context, '/');
}
return Center(
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/back.png"),
fit: BoxFit.cover,
)
),
child: Scaffold(
backgroundColor: Theme.of(context).backgroundColor,
body: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Container(
width: 300,
child: LinearProgressIndicator(
value: loading,
valueColor: AlwaysStoppedAnimation<Color>(ProjectColors.primaryDark),
),
)
],
),
],
)
),
),
);
}
}
HomeScreen.dart
:
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> with SingleTickerProviderStateMixin {
List<Widget> images;
initState() {
super.initState();
getImages();
}
void getImages() async {
List imgs = getImagesFromDB();
setState(() {
images = imgs.map((image) {
// Convert imgs from db into Widget
Widget imageWidget = ...
return Container(
child: imageWidget,
);
}).toList();
});
}
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/back.png"),
fit: BoxFit.cover,
)
),
child: Scaffold(
backgroundColor: Theme.of(context).backgroundColor,
body: Column(
children: images == null ? images : <Widget>[],
),
)
);
}
}
我很乐意重新考虑任何观点以遵循最佳实践。
非常感谢您的帮助。