我怎样才能在构建之外获得上下文?

问题描述

我使用StreamProvider在我的应用程序中接收Firestore数据。我使用lazy_load_scrollview包在图像gridview中进行分页。在StreamProvider中,我必须传递上下文以侦听数据流。就像Provider.of (context)一样。所以我必须在构建中定义它。但是在_loadMore()方法中,我在代码中定义了我需要图像(这是我收听Stream的地方)列表以更新数据列表以进行分页分页效果很好,但是当我第一次启动该应用程序时,它仅显示加载指示器,不加载任何内容。当我向下滑动屏幕时,它开始加载并且分页工作正常。要在我第一次启动时加载网格项目,我需要在initState()中调用_loadMore()方法。我不能称呼它,因为它在内部。但是我无法在构建之外定义该方法,因为它需要定义Stream侦听器(即图像)。我无法从构建外部获取上下文来执行此操作。有什么方法可以使上下文超出构建范围?还是有更好的分页解决方案?如果您能建议我一个解决方案,我将不胜感激。这是我的代码

class ImageGridView extends StatefulWidget {
  @override
  _ImageGridViewState createState() => _ImageGridViewState();
}

class _ImageGridViewState extends State<ImageGridView> {

  List<GridImage> data = [];
  int currentLength = 0;

  final int increment = 10;
  bool isLoading = false;

  // I need to call _loadMore() method inside the initState
  /*@override
  void initState() {
   _loadMore();
    super.initState();
  }*/

  @override
  Widget build(BuildContext context) {

    // listening to firebase streams
    final images = Provider.of<List<GridImage>>(context) ?? [];
    

    Future _loadMore() async {
      print('_loadMore called');
      setState(() {
        isLoading = true;
      });

      // Add in an artificial delay
      await new Future.delayed(const Duration(seconds: 1));
      for (var i = currentLength; i < currentLength + increment; i++) {

      if (i >= images.length) {
        setState(() {
          isLoading = false;
        });
        print( i.toString());
      } else {
        data.add(images[i]);
      }

    }

    setState(() {
      print('future delayed called');
      isLoading = false;
      currentLength = data.length;
    });
  } 

    images.forEach((data) {
      print('data' + data.location);
      print(data.url);
      //print('images length ' + images.length.toString());
    }); 

    try {

      return LazyLoadScrollView(
        isLoading: isLoading,onEndOfPage: () {
          return _loadMore();
        },child: GridView.builder(
          itemCount: data.length + 1,gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 2,),itemBuilder: (context,index) {

            if (index == data.length) {
              return CupertinoActivityIndicator();
            } 
            
            //passing images stream with the item index to ImageGridItem
            return ImageGridItem(gridImage: data[index],); 
          },);
      
    } catch (e) {

      return Container(
        child: Center(
          child: Text('Please Upload Images'),)
      );

    }

    
  }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)