' 在颤振应用程序中,android,ios,database,flutter,dart"/>

首页 > 解决方案 > 输入'列表' 不是类型 'Map 的子类型' 在颤振应用程序中

问题描述

我正在创建一个能够从实时数据库加载信息的应用程序。创建列表时出现问题。请帮忙!不要对我太苛刻,我是编程新手。非常感谢 Peter Haddad 提供的代码示例。

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:.../anketa/tile.dart';


class Anketa extends StatefulWidget {
  Anketa({Key key, this.title}) : super(key: key);
  final String title;

  @override
  _AnketaState createState() => _AnketaState();
}

class _AnketaState extends State<Anketa> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(

      body: Center(
          child: SingleChildScrollView(
            child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text("Registration form",
                      style: TextStyle(
                          fontWeight: FontWeight.w200,
                          fontSize: 30,
                          fontFamily: 'Roboto',
                          fontStyle: FontStyle.italic)),
                  RegisterStudent(),
                ]),
          )),
    );
  }
}

class RegisterStudent extends StatefulWidget {
  RegisterStudent({Key key}) : super(key: key);

  @override
  _RegisterStudentState createState() => _RegisterStudentState();
}

class _RegisterStudentState extends State<RegisterStudent> {
  final _formKey = GlobalKey<FormState>();
  final listOfClubs = ["Club1", "Club2", "Club3", "Club4"];
  String dropdownValue = "Club1";
  final clubController = TextEditingController();
  final nameController = TextEditingController();
  final placeController = TextEditingController();
  final dateController = TextEditingController();
  final emailController = TextEditingController();
  final phoneController = TextEditingController();
  final rawController = TextEditingController();

  final dbRef = FirebaseDatabase.instance.reference().child("record");



  @override
  Widget build(BuildContext context) {
    return Form(
        key: _formKey,
        child: SingleChildScrollView(
            child: Column(children: <Widget>[
              Padding(
                padding: EdgeInsets.all(20.0),
                child: TextFormField(
                  controller: nameController,
                  decoration: InputDecoration(
                    labelText: "EnterName",
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(10.0),
                    ),
                  ),
                  // The validator receives the text that the user has entered.
                  validator: (value) {
                    if (value.isEmpty) {
                      return "Enter name";
                    }
                    return null;
                  },
                ),
              ),
              Padding(
                padding: EdgeInsets.all(20.0),
                child: DropdownButtonFormField(
                  value: dropdownValue,
                  icon: Icon(Icons.arrow_downward),
                  decoration: InputDecoration(
                    labelText: "Club",
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(10.0),
                    ),
                  ),
                  items: listOfClubs.map((String value) {
                    return new DropdownMenuItem<String>(
                      value: value,
                      child: new Text(value),
                    );
                  }).toList(),
                  onChanged: (String newValue) {
                    setState(() {
                      this.dropdownValue = newValue;
                    });
                  },
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Club';
                    }
                    return null;
                  },
                ),
              ),
              Padding(
                padding: EdgeInsets.all(20.0),
                child: TextFormField(
                  keyboardType: TextInputType.number,
                  controller: dateController,
                  decoration: InputDecoration(
                    labelText: "Date",
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(10.0),
                    ),
                  ),
                  // The validator receives the text that the user has entered.
                  validator: (value) {
                    if (value.isEmpty) {
                      return 'Date';
                    }
                    return null;
                  },
                ),
              ),
              Padding(
                  padding: EdgeInsets.all(20.0),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                    children: <Widget>[
                      RaisedButton(
                        color: Colors.lightBlue,
                        onPressed: () {
                          if (_formKey.currentState.validate()) {
                            dbRef.push().set({
                              "Name": nameController.text,
                              "date": dateController.text,
                              "Club": dropdownValue
                            }).then((_) {
                              Scaffold.of(context).showSnackBar(
                                  SnackBar(content: Text('Add')));
                              dateController.clear();
                              nameController.clear();
                            }).catchError((onError) {
                              Scaffold.of(context)
                                  .showSnackBar(SnackBar(content: Text(onError)));
                            });
                          }
                        },
                        child: Text('Enter'),
                      ),
                      RaisedButton(
                        color: Colors.amber,
                        onPressed: () {
                          Navigator.push(
                            context,
                            MaterialPageRoute(builder: (context) => ListOfNames()),
                          );
                        },
                        child: Text('Go to'),
                      ),
                    ],
                  )),
            ])));
  }

  @override
  void dispose() {
    super.dispose();
    dateController.dispose();
    nameController.dispose();
  }
}

第一部分工作正常,但第二部分显示一个问题:

“类型‘列表’不是‘地图<动态,动态>’类型的子类型”

import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';

class ListOfNames extends StatelessWidget {
  final dbRef = FirebaseDatabase.instance.reference().child("record");
  List<Map<dynamic,dynamic>> lists = List();
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.grey.shade300,
        appBar: AppBar(
          backgroundColor: Colors.deepPurple,
          title: Text("List of students"),
        ),
        body: StreamBuilder(
            stream: dbRef.onValue,
            builder: (context, AsyncSnapshot<Event> snapshot) {
              if (snapshot.hasData) {
                lists.clear();
                DataSnapshot dataValues = snapshot.data.snapshot;
                Map<dynamic, dynamic> values = dataValues.value;
                values.forEach((key, values) {
                  lists.add(values);
                });
                return new ListView.builder(
                    shrinkWrap: true,
                    itemCount: lists.length,
                    itemBuilder: (BuildContext context, int index) {
                      return Card(
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            Text("Name: " + lists[index]["Name"]),
                            Text("date: "+ lists[index]["date"]),
                            Text("Club: " +lists[index]["Club"]),
                          ],
                        ),
                      );
                    });
              }
              return CircularProgressIndicator();
            })
    );
  }
}

标签: androidiosdatabaseflutterdart

解决方案


我刚刚尝试了上面的代码没有问题:

在此处输入图像描述

问题很可能来自您的数据库,您需要具有以下结构:

record
  -MChbb_mi16epRxtEPFy
   Club: "Club4"
   Name: "pryrt"
   date: "1255"


推荐阅读