Как я могу получить контекст вне сборки во флаттере?
Я использую 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'),
)
);
}
}
}