Как я могу получить контекст вне сборки во флаттере?

Я использую StreamProvider для получения данных firestore в своем приложении. И я использую lazy_load_scrollview пакет для нумерации страниц в сетке изображений. В StreamProvider мне нужно передать контекст для прослушивания потоков данных. Так же, как Provider.of(context). Поэтому я должен определить это внутри сборки. Но в методе _loadMore(), который я определил в коде, мне нужны изображения (здесь я слушаю Stream), чтобы обновить список данных для разбивки на страницы. Разбиение на страницы работает нормально, но когда я впервые запускаю приложение, оно показывает только индикатор загрузки и ничего не загружает. Когда я смахиваю экран вниз, он начинает загружаться, и разбивка на страницы работает нормально. Чтобы загрузить элементы сетки при первом запуске, мне нужно вызвать метод _loadMore() в initState(). Я не могу назвать это, потому что он внутри сборки. Но я не могу определить этот метод вне сборки, потому что он должен определять слушателя потока (который является изображениями). Я могу'Для этого нужно получить контекст за пределами сборки. Есть ли способ получить контекст вне сборки? или есть лучшее решение для нумерации страниц? Буду признателен, если вы подскажете мне решение. вот мой код,

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'),
        )
      );

    }

    
  }
}

0 ответов

Другие вопросы по тегам