我有一个页面小部件,可在Android设备上使用Image.network()显示一长串图像。长时间滚动并显示所有图像后,内存增加了很多,达到200MB。该应用程序在atm上运行良好,然后我离开页面,调用dispose()。但是,内存使用量仍然没有减少。
从图中可以看到,外部存储器正在占用186MB的空间,并且永远不会崩溃。我阅读了devTool文档,其中外部存储器是本机对象。但是为什么不收集垃圾呢?也许这只是管理内存的android方法?
请检查下面的示例代码。我将其放置在tabbarviews中,当我选择另一个标签时,该页面就会被丢弃。
class TestScreen extends StatefulWidget {
const TestScreen({Key key}) : super(key: key);
@override
createState() => _TestScreenState();
}
class _TestScreenState extends State<TestScreen> with SingleTickerProviderStateMixin {
List<Product> products = [];
@override
void initState() {
super.initState();
print("initState");
fetchProducts();
}
@override
void dispose() {
print("dispose");
super.dispose();
}
Future fetchProducts() async {
//get the list of products
setState(() {
products = ...;
});
}
@override
Widget build(BuildContext context) {
ThemeData theme = Theme.of(context);
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: GridView.builder(
itemCount: products.length,
padding: EdgeInsets.all(4.0),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 2.0,
crossAxisSpacing: 2.0,
childAspectRatio: 0.8),
itemBuilder: (context, position) {
final product = products[position];
final imageData = product.mainImage;
if (imageData != null && imageData.downloadURL != null) {
return Image.network(
imageData.downloadURL,
fit: BoxFit.fill,
);
} else {
return Image.asset("assets/images/product_image_placeholder.jpg");
}
}),
),
);
}
}