Closure call with mismatched arguments: function '[]' in flutter

爱⌒轻易说出口 提交于 2020-12-26 18:48:52

问题


** I am getting this error**

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

my code where I am receiving the data from firestore is this..

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),
              ],
            ),
          )
        ],
      ),
    );
  }
}

can someone tell me where I am going wrong

ps: this is a quiz app where I am getting the data from the firestore, using streams. data saved on the firestore has three fields, "url", "title" "desc". I want to retrieve them in the below widget and want to display them in a stack, but this error got me stuck in-between.


回答1:


You need to do the following:

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'],
   );
  }
);

Since you are reference a collection, then you need to use docs which will retrieve a list of documents inside that collection:

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

Then to access each field in the document, you need to call data()




回答2:


The answer by @Peter Haddad is correct. Just to highlight the difference with an example from my own code:

The previous version of code which created the same error:

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

Updated version of code which solved the error:

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


来源:https://stackoverflow.com/questions/64186306/closure-call-with-mismatched-arguments-function-in-flutter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!