Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 当i';我正在提取下一个数据_Flutter_Gridview_Progress Bar - Fatal编程技术网

Flutter 当i';我正在提取下一个数据

Flutter 当i';我正在提取下一个数据,flutter,gridview,progress-bar,Flutter,Gridview,Progress Bar,我的目标是在获取下一页时将进度条添加到GridView的末尾。我尝试在到达屏幕的末尾时使进度条可见,然后使用isLoading bool在fetch中禁用它,但它没有显示任何内容,并且我尝试根据GridView中的itemcount显示进度条。以下是未经我尝试的代码: class _PopularGalleryGridState extends State<PopularGalleryGrid> { List<Photo> data = new List<

我的目标是在获取下一页时将进度条添加到GridView的末尾。我尝试在到达屏幕的末尾时使进度条可见,然后使用isLoading bool在fetch中禁用它,但它没有显示任何内容,并且我尝试根据GridView中的itemcount显示进度条。以下是未经我尝试的代码:

class _PopularGalleryGridState extends State<PopularGalleryGrid> {
      List<Photo> data = new List<Photo>();

      ScrollController _scrollController = new ScrollController();
      StreamController<List<Photo>> _photosStreamController =
          StreamController<List<Photo>>.broadcast();

      Future<List<Photo>> _fetchPhotos() async {
        developer.log('fetch photos');
        try {
          final response =
              await http.get(galleryUrl + page.toString() + "&limit=10");
          Map<String, dynamic> decodedJson = json.decode(response.body);
          List photos = decodedJson['data'] as List;
          List<Photo> result =
              (photos.map((photo) => Photo.fromJson(photo))).toList();
          data.addAll(result);
          _photosStreamController.sink.add(data);
        } catch (e) {
          _photosStreamController.sink.addError(e);
        }
      }

      @override
      void initState() {
        data.clear();
        _scrollController.addListener(() {
          if (_scrollController.position.pixels ==
              _scrollController.position.maxScrollExtent) {
            developer.log('scroll controller');
            page++;
            _fetchPhotos();
          }
        });
        _photosStreamController.onListen = _fetchPhotos;
        super.initState();
      }

      @override
      void dispose() {
        super.dispose();
        _scrollController.dispose();
        _photosStreamController?.close();
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: StreamBuilder<List<Photo>>(
          stream: _photosStreamController.stream,
          builder: (context, snapshot) {
            developer.log('builder');
            if (snapshot.hasData || data.isNotEmpty) {
              return _photoGridView(snapshot.data ?? data);
            } else if (snapshot.hasError) {
              return Text("${snapshot.hasError}");
            }
            return CircularProgressIndicator();
          },
        ));
      }

      GridView _photoGridView(data) {
        return GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,
            childAspectRatio: 1.0,
            mainAxisSpacing: 4.0,
            crossAxisSpacing: 4.0,
          ),
          itemCount: data.length,
          itemBuilder: (context, index) {
            return Card(
              elevation: 4,
              child: GestureDetector(
                onTap: () => _navigateToImage(context, data[index].id),
                child: Image.network(
                    ('http://gallery.dev.webant.ru/media/' + data[index].image)),
              ),
            );
          },
          controller: _scrollController,
        );
      }

      void _navigateToImage(BuildContext context, int id) {
        Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) => SingleImage(imageId: id),
          ),
        );
      }
    }
class\u PopularGalleryGridState扩展状态{
列表数据=新列表();
ScrollController_ScrollController=新的ScrollController();
StreamController\u PhotoStreamController=
StreamController.broadcast();
Future\u fetchPhotos()异步{
developer.log(“获取照片”);
试一试{
最后答复=
等待http.get(galleryUrl+page.toString()+“&limit=10”);
Map decodedJson=json.decode(response.body);
将照片列表=decodedJson['data']作为列表;
列表结果=
(photos.map((photo)=>photo.fromJson(photo)).toList();
data.addAll(结果);
_PhotostreamController.sink.add(数据);
}捕获(e){
_PhotostreamController.sink.addError(e);
}
}
@凌驾
void initState(){
data.clear();
_scrollController.addListener((){
如果(_scrollController.position.pixels==
_scrollController.position.maxScrollExtent){
developer.log(“滚动控制器”);
page++;
_获取照片();
}
});
_PhotostreamController.onListen=\u获取照片;
super.initState();
}
@凌驾
无效处置(){
super.dispose();
_scrollController.dispose();
_PhotostreamController?.close();
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:StreamBuilder(
流:_photostreamcontroller.stream,
生成器:(上下文,快照){
developer.log(“builder”);
if(snapshot.hasData | | data.isNotEmpty){
返回photoGridView(snapshot.data??data);
}else if(snapshot.hasrerror){
返回文本(“${snapshot.hasError}”);
}
返回循环ProgressIndicator();
},
));
}
GridView\u photoGridView(数据){
返回GridView.builder(
gridDelegate:SliverGridDelegateWithFixedCrossAxisCount(
交叉轴计数:2,
childAspectRatio:1.0,
主轴间距:4.0,
交叉轴间距:4.0,
),
itemCount:data.length,
itemBuilder:(上下文,索引){
回程卡(
标高:4,
儿童:手势检测器(
onTap:()=>\u navigateToImage(上下文,数据[index].id),
孩子:Image.network(
('http://gallery.dev.webant.ru/media/“+数据[索引].图像],
),
);
},
控制器:\ u滚动控制器,
);
}
void _navigateToImage(BuildContext上下文,int id){
导航器.of(上下文).push(
材料路线(
生成器:(上下文)=>SingleImage(imageId:id),
),
);
}
}

您可能需要使用count和itemBuilder。我希望你明白要点

itemCount: data.length+1,
          itemBuilder: (context, index) {
          if(index==data.length) return CircularProgressIndicator();
或者,您可以维护位于ListView下方的加载状态标志,该标志在加载状态为true时触发