Флаттер изображения памяти не получает gc - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть виджет страницы для отображения длинного списка изображений с помощью Image.network () на устройстве android. После долгой прокрутки и отображения каждого изображения объем памяти увеличился до 200 МБ. Приложение работает нормально, а затем я покидаю страницу, dispose () вызвал. Однако использование памяти по-прежнему не уменьшается.

enter image description here

, как видно из графика, внешняя память занимает 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");
            }
          }),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...