Flutter: StreamBuilder ведет себя как StatelessWidget - PullRequest
0 голосов
/ 20 января 2019

Я новичок в программировании и пытаюсь написать приложение во Флаттере. Я загружаю данные из 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]),
              );
            });
      },
    );
  }
}

1 Ответ

0 голосов
/ 13 марта 2019

Я также работаю с пакетом 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) ));
            }
          );
        },
      );}

    }
  )),

);}}
...