Chamada de fechamento com argumentos incompatíveis: função '[]' em flutter

Oct 03 2020

** Estou recebendo este erro**

Closure call with mismatched arguments: function '[]'
Receiver: Closure: (dynamic) => dynamic from Function 'get':.
Tried calling: []("url")
Found: [](dynamic) => dynamic

meu código onde estou recebendo os dados da firestore é este ..

import 'package:flutter/material.dart';
import 'package:riyazat_quiz/services/database.dart';
import 'package:riyazat_quiz/views/create_quiz.dart';
import 'package:riyazat_quiz/widgets/widgets.dart';

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  Stream quizStream;
  DatabaseService databaseService = DatabaseService(); // this is to call the getQuizData()  async{
return await  FirebaseFirestore.instance.collection("Quiz").snapshots();
  }


 Widget quizList(){
   return Container(
     child: StreamBuilder(
       stream:quizStream ,
       builder: (context,snapshort){
         return snapshort.data == null ? CircularProgressIndicator(): ListView.builder(
             scrollDirection: Axis.vertical,
             shrinkWrap: true,
             itemCount : snapshort.data.documents.length ,
             itemBuilder : (context,index){ return QuizTile(url:snapshort.data.documents[index].get['url'],
               title:snapshort.data.documents[index].get['title'] ,
               desc: snapshort.data.documents[index].get['desc'],);}

         );
       }
     ),
   );
 }

 @override
  void initState() {
  databaseService.getQuizData().then((val){
    setState(() {
      quizStream =val;

    });
  });
    super.initState();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Center(
          child: appBar(context),
        ),
        backgroundColor: Colors.transparent,
        elevation: 0.0,
        brightness: Brightness.light,
      ),
      body:
        Column(
          children: [
            quizList(),
            FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => CreateQuiz()));
              },
            ),
          ],
        ),

    );
  }
}

class QuizTile extends StatelessWidget {
  final String  url,title,desc;
  QuizTile({@required this.url,@required this.title,@required this.desc});
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Stack(
        children: [
          Image.network(url),
          Container(
            child: Column(
              children: [
                Text(title),
                Text(desc),
              ],
            ),
          )
        ],
      ),
    );
  }
}

alguém pode me dizer onde estou errado

ps: este é um aplicativo de teste onde estou obtendo os dados do firestore, usando fluxos. os dados salvos no firestore têm três campos, "url", "title" "desc". Quero recuperá-los no widget abaixo e exibi-los em uma pilha, mas esse erro me deixou preso no meio.

Respostas

2 PeterHaddad Oct 03 2020 at 16:30

Você precisa fazer o seguinte:

itemCount : snapshort.data.docs.length ,
itemBuilder : (context,index){ 
  return QuizTile(url:snapshort.data.docs[index].data()['url'],
      title:snapshort.data.docs[index].data()['title'] ,
      desc: snapshort.data.docs[index].data()['desc'],
   );
  }
);

Como você faz referência a uma coleção, precisa usar o docsque recuperará uma lista de documentos dentro dessa coleção:

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/query_snapshot.dart#L18

Então, para acessar cada campo do documento, você precisa chamar data()

Max Nov 15 2020 at 16:31

A resposta de @Peter Haddad está correta. Apenas para destacar a diferença com um exemplo do meu próprio código:

A versão anterior do código que criou o mesmo erro:

snapshot.data.docs[index].data["chatRoomID"]

Versão atualizada do código que resolveu o erro:

snapshot.data.docs[index].data()["chatRoomID"]