Flutter是否会在ListView中回收图像?

时间:2018-07-08 10:44:20

标签: android http caching flutter infinite-scroll

我想在Fluter中进行无休止的喂食,但该应用程序终止了,但没有提供任何原因。基本上,它发生在我向下滚动约60张图像之后,然后开始滞后并崩溃。

我测试了另一个API,但是在那里也一样。它使用分辨率较低的图像,因此向下滚动直到停止工作需要更长的时间。

所以我不知道这里会发生什么。我的猜测是,ListView中有很多图像,因此手机无法处理它并崩溃。 我将整个代码放在下面,因为我什至不知道问题可能在哪里。是否有另一种方法可以实现endlessImageFeed?

import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';

import 'package:http/http.dart' as http;
import 'package:cached_network_image/cached_network_image.dart';

// my base url
String imageUrl = "http://192.168.2.107:8000";




void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'EndlessFeed',
      theme: ThemeData(
        primaryColor: Colors.white,
      ),
      home: PhotoList(),

    );
  }
}

class PhotoList extends StatefulWidget {
  @override
  PhotoListState createState() => PhotoListState();

}

class PhotoListState extends State<PhotoList> {
  StreamController<Photo> streamController;
  List<Photo> list = [];

  @override
  void initState() {
    super.initState();
    streamController = StreamController.broadcast();

    streamController.stream.listen((p) => setState(() => list.add(p)));

    load(streamController);

  }

  load(StreamController<Photo> sc) async {

    // URL for API
    String url = "http://192.168.2.107:8000/api/";
    /* ______________________________________________
    I also tried another API but it chrashes also (but it takes longer until crash):
        String url = "https://jsonplaceholder.typicode.com/photos/";
    ______________________________________________ */


    var client = new http.Client();

    var req = new http.Request('get', Uri.parse(url));

    var streamedRes = await client.send(req);

    streamedRes.stream
        .transform(UTF8.decoder)
        .transform(json.decoder)
        .expand((e) => e)
        .map((map) => Photo.fromJsonMap(map))
        .pipe(sc);
  }

  @override
  void dispose() {
    super.dispose();
    streamController?.close();
    streamController = null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("EndlessFeed"),
      ),
      body: Center(
        child: ListView.builder(
          itemBuilder: (BuildContext context, int index) => _makeElement(index),
        ),
      ),
    );
  }

  Widget _makeElement(int index) {
    if (index >= list.length) {
      return null;
    }

    return Container(
        child: Padding(
          padding: EdgeInsets.only(top: 20.0),
          child: Column(
            children: <Widget>[

                child: new Container(

                  // my base URL + one image
                  child: new Image(image: new CachedNetworkImageProvider(imageUrl + list[index].mImage))

                ),
              ),
            ],
          ),
        ));
  }
}

class Photo {
  final String mImage;

  Photo.fromJsonMap(Map map)
      : mImage= map['mImage'];
}

0 个答案:

没有答案