Flutter: StreamBuilder ведет себя как StatelessWidget
Я новичок в программировании и пытаюсь написать приложение во Флаттере. Я загружаю данные из algolia в StreamBuilder (используя библиотеку algolia в сочетании с as.Stream() - в противном случае это не работает). Код работает хорошо, но он не обновляет данные автоматически - мне нужно загрузить новый экран в приложении или выполнить горячую перезагрузку, а затем данные обновляются. Похоже, StatefulWidget ведет себя как StatelessWidget. Есть ли у вас какие-либо идеи - может быть, включить куда-нибудь setState (который, я думал, не нужен для StreamBuilder)? Спасибо за вашу помощь;-).
import 'package:first_app/group_detail.dart';
import 'package:flutter/material.dart';
import 'package:algolia/algolia.dart';
class First extends StatefulWidget {
@override
FirstState createState() {
return new FirstState();
}
}
class FirstState extends State<First> {
static Algolia algolia = Algolia.init(
applicationId: 'xxx',
apiKey: 'xxx',
);
queryFunc() {
AlgoliaQuery query = algolia.instance.index('places).setAroundLatLng('51.5078845,7.4702625');
Future<AlgoliaQuerySnapshot> snap = query.getObjects();
return snap;
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return StreamBuilder(
stream: queryFunc().asStream(),
builder:
(BuildContext context, AsyncSnapshot<AlgoliaQuerySnapshot> snapshot) {
if (!snapshot.hasData) return new Text('Loading...');
final int documentsLength = snapshot.data.hits.length;
return new ListView.builder(
itemCount: documentsLength,
itemBuilder: (context, int index) {
final AlgoliaObjectSnapshot document = snapshot.data.hits[index];
return new ListTile(
leading: CircleAvatar(
child: Text(document.data['name'].substring(0, 1))),
title: new Text(document.data['name']),
subtitle: new Text(document.data['text]),
);
});
},
);
}
}
0 ответов
Я также работаю с пакетом Algolia для Dart и где борюсь с реализацией. Теперь ваш вопрос мне очень помог, и я думаю, что я также могу помочь вам с вашей проблемой. Вместо этого вы должны использовать FutureBuilder. Мой код выглядит так и очень похож на ваш, но должен работать для вашего случая:)
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
final Searchalgolia searchalgolia = new Searchalgolia();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('test'),
),
body: Container(child:
FutureBuilder(
// perfomrs query in Algolia and returns snap from .getObjects()
future: searchalgolia.searchAlgolia("joas"),
builder: (BuildContext context, AsyncSnapshot snapshot){
if(snapshot.data == null ){
return LinearProgressIndicator();
}
else {
return ListView.builder(
itemCount: snapshot.data.hits.length,
itemBuilder: (BuildContext context, int index) {
final AlgoliaObjectSnapshot document = snapshot.data.hits[index];
return ListTile(
title: Text(document.data['subject']),
onTap: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => PatientOverview(snapshot.data[index].id,
"AZ" + snapshot.data[index].id) ));
}
);
},
);}
}
)),
);}}