0

I'm trying to make a stream on screen of a list of String 'title' and Bool 'ok' fields of the back4app 'listacompras' class, but it's not working, it builds the listView but does not update, it stays fixed even when there is an update in the Stream. I'm new to flutter and parse-platform back4app, forgive me for the bad formatting of the script.

import 'package:flutter/material.dart';
import 'package:listacompras2/pages/home.dart';
import 'package:listacompras2/repos/cruds.dart';
import 'package:parse_server_sdk_flutter/parse_server_sdk_flutter.dart';

class Repo extends StatefulWidget implements Cruds {

  final String sourceCollection = 'listacompras';
  final query = QueryBuilder<ParseObject>(ParseObject('listacompras'))
    ..orderByAscending('ok')
    ..orderByAscending('section')
    ..orderByAscending('title');

  Stream<List<ParseObject>> queryLive() async* {
    final parseObject = ParseObject(sourceCollection);
    final QueryBuilder<ParseObject> query =
    QueryBuilder<ParseObject>(parseObject)
      ..orderByAscending('ok')
      ..orderByAscending('section')
      ..orderByAscending('title');

    final LiveQueryClient client = LiveQueryClient();
    final LiveQuery liveQuery = LiveQuery();

    ParseResponse apiResponse = await query.query();

    ParseResponse upDateResponse(ParseResponse response) {
      apiResponse = response;

      apiResponse.results.forEach((element) {
        print('######### upDateResponse() #########  ${element.get<String>('title')} ::: ${element.get<bool>('ok')}');
      });
      return apiResponse;
    }

    final listen = await liveQuery.client
        .subscribe(query);
    listen.on(LiveQueryEvent.update, (value) async {

          apiResponse = await value.getAll();
          apiResponse.results.forEach((element) {
            print('####Dentro do Liste ON ###################  ${element.get<String>('title')} ::: ${element.get<bool>('ok')}');
          });
          upDateResponse(apiResponse);
    }

        );

    apiResponse.results.forEach((element) {
      print('****** antes do yield ###########  ${element.get<String>('title')} ::: ${element.get<bool>('ok')}');
    });
    yield apiResponse.results;
  }


  @override
  State<Repo> createState() => _RepoState();

  Home home = Home();

  //cria iteração até 9 requisições e espera 1 segundo
  Future<void> iterar(List<ParseObject> rows) async {
    int i = 0;
    for (final row in rows) {
      if (i < 9) {
        await row.delete();
      } else {
        await Future.delayed(Duration(milliseconds: 800));
        i = 0;
      };
      i++;
    }
  }


  @override
  void deleteAllTodos() async {
    final query = QueryBuilder(ParseObject(sourceCollection));
    final response = await query.query();
    final rows = response.results.cast<ParseObject>();
    await iterar(rows);
  }

  @override
  void saveData(String title, String section) async {
    final listacompras = ParseObject(sourceCollection);
    listacompras
      ..set<String>('title', title)
      ..set<bool>('ok', false)
      ..set<String>('section', section);
    await listacompras.save();
  }

  @override
  void showDeleteListConfirmationDialog(context) {
    showDialog(
      context: context,
      builder: (context) => AlertDialog(
        title: Text('Limpar Tudo?'),
        content: Text('Voce tem certeza que deseja apagar todos os itens?'),
        actions: [
          TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              style: TextButton.styleFrom(foregroundColor: Colors.redAccent),
              child: Text('Cancelar')),
          TextButton(
              onPressed: () {
                Navigator.of(context).pop();
                deleteAllTodos();
              },
              style: TextButton.styleFrom(foregroundColor: Colors.blueAccent),
              child: Text('Limpar Tudo')),
        ],
      ),
    );
  }
}

//montando a lista na tela principal
class _RepoState extends State<Repo> {


  Stream<List<ParseObject>> _stream;

  @override
  void initState() {
    super.initState();
    _stream = repo.queryLive();
  }

  List<dynamic> documents;
  Map<String, dynamic> _lastRemoved;
  String _lastRemovedPos;
  Repo repo = Repo();

  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: _stream,
      builder: (context, snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.none:
          case ConnectionState.waiting:
            return Center(
              child: CircularProgressIndicator(),
            );
          default:
            if (snapshot.hasData) {
              documents = snapshot.data;
            }
            return ListView.builder(
                itemCount: documents.length, itemBuilder: buildItem);
        }
      },
    );
  }

  Widget buildItem(BuildContext context, int index) {
    return Dismissible(
      key: Key(DateTime.now().millisecondsSinceEpoch.toString()),
      background: Container(
        color: Colors.red,
        child: Align(
          alignment: Alignment(0.9, 0.0),
          child: Icon(Icons.delete, color: Colors.white, size: 26),
        ),
      ),
      direction: DismissDirection.endToStart,
      child: CheckboxListTile(
        title: Text(documents[index]["title"]),
        value: documents[index]["ok"],
        secondary: CircleAvatar(
          child: Icon(documents[index]["ok"] ? Icons.check : Icons.error),
        ),
        onChanged: (c) {
          setState(() {

          });
        },
      ),
      onDismissed: (direction) {
        setState(() {
          _lastRemoved = Map.from(documents[index].data());
          _lastRemovedPos = documents[index].id;

          setState(() {

          });

          final snack = SnackBar(
            content: Text("Item \"${_lastRemoved["title"]}\" removido!"),
            action: SnackBarAction(
                label: "Desfazer",
                onPressed: () {
                  setState(() {

                  });
                }),
            duration: Duration(seconds: 3),
          );
          ScaffoldMessenger.of(context).removeCurrentSnackBar();
          ScaffoldMessenger.of(context).showSnackBar(snack);
        });
      },
    );
  }
}

I'm trying to make a stream on screen of a list of String 'title' and Bool 'ok' fields of the back4app 'listacompras' class, but it's not working. My wish would be for the realtime list to be assembled in:

  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: _stream,
      builder:
          (BuildContext context, AsyncSnapshot<List<ParseObject>> snapshot) { (...)

0 Answers0