У меня есть виджет страницы для отображения длинного списка изображений с помощью Image.network () на устройстве android. После долгой прокрутки и отображения каждого изображения объем памяти увеличился до 200 МБ. Приложение работает нормально, а затем я покидаю страницу, dispose () вызвал. Однако использование памяти по-прежнему не уменьшается.
![enter image description here](https://i.stack.imgur.com/gtyt0.png)
, как видно из графика, внешняя память занимает 186 МБ пространства и никогда идет вниз. Я прочитал devTool do c, что внешняя память является нативными объектами. Но почему они не собирают мусор? Или, может быть, это просто android способ управления памятью?
Пожалуйста, проверьте ниже мой пример кода. Я помещаю его в панель вкладок, при выборе другой вкладки страница удаляется.
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");
}
}),
),
);
}
}