#flutter #dart
#трепетание #дротик
Вопрос:
У меня есть метод, который получает предметы из firestore и хранилища. Я внес некоторые изменения, чтобы иметь возможность обновлять список с помощью построителя потоков:
class ItemLab {
final String tipo;
final Reference elemento;
final String pastaVideo;
final Map video;
final String imageUrl;
ItemLab({
this.tipo,
this.elemento,
this.video,
this.imageUrl,
this.pastaVideo
});
}
class LabController {
final databaseReference = FirebaseFirestore.instance;
final _storage = FirebaseStorage.instance;
final picker = ImagePicker();
bool hasMore = false;
Stream<List<ItemLab>> stream;
StreamController<List<ItemLab>> _streamController;
LabController() {
_streamController = StreamController<List<ItemLab>>.broadcast();
stream = _streamController.stream..toList();
}
void closeStream() {
_streamController.stream.drain();
}
loadLab(String submenu, [int limit]) async* {
var parts = submenu.split('/');
var pathSlashless = parts[0].trim();
var subPathSlashless = parts.sublist(1).join('/').trim();
var snapshot = await _storage.ref().child("/${submenu}");
var retorno = await snapshot.listAll();
List<ItemLab> conteudo = [];
if(subPathSlashless.isEmpty || subPathSlashless == null){
retorno.prefixes.forEach((element) {
conteudo.add(
ItemLab(
tipo: 'PASTA',
elemento: element,
),
);
});
}
for(int i = 0; i < retorno.items.length ; i ){
var url = await retorno.items[i].getDownloadURL();
conteudo.add(
ItemLab(
tipo: 'FILE',
elemento: retorno.items[i],
imageUrl: url,
),
);
if(limit != null){
if(conteudo.length > limit){
hasMore = true;
yield conteudo;
}else{
hasMore = false;
print("less than 9");
}
}
}
if(subPathSlashless.isNotEmpty){
print(subPathSlashless);
List items;
await databaseReference
.collection("lab_${pathSlashless}_url")
.snapshots().forEach((element) {
element.docs.forEach((f) {
if(f.data()['videos'] != null){
items == null ? items = f.data()['videos'] :
items.addAll(f.data()['videos']);
};
print("ITEMS :::: >>> ${items}");
});
});
for(int i = 0; i < items.length; i ){
//print(items[i]);
conteudo.add(
ItemLab(
tipo: 'VIDEO',
elemento: null,
video: items[i],
),
);
}
}else{
await databaseReference
.collection("lab_${pathSlashless}_url")
.snapshots().forEach((element) {
element.docs.forEach((f) {
if(f.data().isNotEmpty){
//print(f.data());
if(f.data().keys.contains("videos")){
conteudo.add(
ItemLab(
tipo: 'PASTA',
pastaVideo: findFolderName(f.reference.path)
),
);
_streamController.add(conteudo);
}else{
conteudo.add(
ItemLab(
tipo: 'VIDEO',
elemento: null,
video: f.data(),
),
);
_streamController.add(conteudo);
}
}
});
});
}
pathSlashless = null;
subPathSlashless = null;
conteudo = checkDuplicateFolder(conteudo, submenu);
yield conteudo;
}
И я хочу показать это в этом списке:
LabController ctrlLab = LabController();
loadBasicStructure(submenu ,callback, context, scrollController, deviceSize){
return StreamBuilder(
stream: ctrl.stream,
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
}
Но при таком подходе список никогда не заполняется. Он всегда показывает CircularProgressIndicator, но не элементы.. итак, чего мне здесь не хватает?
Комментарии:
1. Мне кажется, что, возможно, ваши правила Firestore не позволяют вам получить доступ к данным. Однако, если вы поделитесь своими правилами, мы можем это исключить. Отредактируйте свой вопрос в соответствии с правилами.
2. Нет, я получаю данные прямо в conteudo.add.. Я уверен в этом
3. Да, но действительно ли поступают данные?
4. Да, я уверен в этом.добавить, что это получение данных
5. По моему мнению, если и есть проблема, то она на самом деле кроется в промежуточном коде, если, конечно, не в извлечении данных. Что вы можете сделать, так это попробовать распечатать контрольные точки. Например, после первого
if
вloadLab
функции выведите «Контрольная точка 1», после второго выведите «Контрольная точка 2» и так далее…