无法将数据从Firebase加载到Listview

时间:2019-11-28 09:44:28

标签: firebase flutter firebase-realtime-database dart

需要帮助...我已经尝试大约一年了,以尝试使这一逻辑正确。我正在尝试从Firebase实时数据库中将信息和1张图像加载到Flutter应用程序li​​stview中。但是我遇到了很多问题,而我最近的问题最严重。

请参见下面的代码:

class funRideDetails{
  String eventName;
  String eventDate;
  String eventPrice;
  String imgUrl;
  funRideDetails({this.eventName,this.eventDate,this.eventPrice,this.imgUrl});
  factory funRideDetails.fromJson(Map<dynamic,dynamic> json){
    return funRideDetails(
      eventName: json['event_name'],
      eventDate: json['event_date'],
      eventPrice: json['event_price'],
      imgUrl: json['img_url']
    );
  }
}

class funRides{
  List<funRideDetails> fRides;
  funRides({this.fRides});
  factory funRides.fromJson(Map<dynamic,dynamic> json){
    return funRides(
      fRides: parseRides(json)
    );
  }

  static List<funRideDetails> parseRides(rideJson){
    var rList = rideJson['FunRides'] as List;
    List<funRideDetails> rideList = rList.map((data) => funRideDetails.fromJson(data)).toList();
    return rideList;
  }
}

class MakeCall{
  List<funRideDetails> list = [];
  Future<List<funRideDetails>> firebaseCalls (DatabaseReference databaseReference)async{
    try{
      funRides rides;
      DataSnapshot snapshot = await databaseReference.once();
      Map<dynamic,dynamic> jsonResponse = snapshot.value[0]['Events'];
      rides = new funRides.fromJson(jsonResponse);
      list.addAll(rides.fRides);
    }catch(e){
      print(e.toString());
    }
    return list;
  }
}

现在是小部件代码:

final DatabaseReference db = FirebaseDatabase.instance.reference();
class HomeScreen extends State<Home>{

  @override
  void initState(){
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: DefaultTabController(
        length: 5,
        child: Scaffold(
          appBar: AppBar(
            automaticallyImplyLeading: true,
            actions: <Widget>[
              IconButton(
                  icon: new Icon(Icons.power_settings_new),
                  onPressed: (){
                    Navigator.of(context).pushReplacementNamed(LOGIN_SCREEN);
                  }
              ),
              IconButton(
                  icon: new Icon(Icons.account_box),
                  onPressed: (){
                    Navigator.of(context).pushReplacementNamed(PROFILE_SCREEN);
                  }
              ),
            ],
            bottom: TabBar(
              tabs: <Widget>[
                Tab(icon: Icon(Icons.motorcycle)),
                Tab(icon: Icon(Icons.whatshot)),
                Tab(icon: Icon(Icons.terrain)),
                Tab(icon: Icon(Icons.language)),
                Tab(icon:Icon(Icons.library_books))
              ],
            ),
            title: Text("Home"),
          ),
          body: TabBarView(
            children: <Widget>[
              new Column(
                children: <Widget>[
                  new Expanded(
                    child: Container(
                        child: futureBuilder
                    ),
                  ),
                ],
              ),
              Icon(Icons.directions_car),
              Icon(Icons.directions_car),
              Icon(Icons.directions_car),
              Icon(Icons.directions_car),
            ],
          ),
        ),
      ),
    );
  }
  var futureBuilder = new FutureBuilder(
    future:MakeCall().firebaseCalls(db),
    builder: (BuildContext context, AsyncSnapshot snapshot){
      switch(snapshot.connectionState){
        case ConnectionState.none: return new Text('Press button to start');
        case ConnectionState.waiting: return new Text('Loading....');
        default:
          if(snapshot.hasError){
            return new Text('Error: ${snapshot.error}');
          }else{
            return ListView.builder(
              itemCount: snapshot.data.length,
              itemBuilder: (BuildContext context, int index){
                return Card(
                  elevation: 0.0,
                  child: Padding(
                      padding: const EdgeInsets.all(0.0),
                      child: SizedBox(
                        height: MediaQuery.of(context).size.height*0.15,
                        width: MediaQuery.of(context).size.width,
                        child: Card(
                          elevation: 0,
                          child: Row(
                            children: <Widget>[
                              new Container(
                                child: Image.network(snapshot.data[index].imgUrl,
                                  height: MediaQuery.of(context).size.width*0.3,
                                  width: MediaQuery.of(context).size.width*0.3,
                                ),
                              ),
                              Padding(
                                padding: const EdgeInsets.only(left: 10,right: 5,top: 5),
                                child: Column(
                                  mainAxisAlignment: MainAxisAlignment.start,
                                    children: <Widget>[
                                      new Container(
                                        child: Column(
                                            mainAxisAlignment: MainAxisAlignment.start,
                                            children: <Widget>[
                                              Column(
                                                mainAxisAlignment: MainAxisAlignment.start,
                                                crossAxisAlignment: CrossAxisAlignment.start,
                                                children: <Widget>[
                                                  Row(
                                                    children: <Widget>[
                                                      new IconTheme(
                                                        data: new IconThemeData(
                                                            color: Colors.black26),
                                                        child: new Icon(Icons.timer,size: 20.0,),
                                                      ),
                                                      Text('${snapshot.data[index].eventDate}',style: TextStyle(fontWeight: FontWeight.w700,color: Colors.black26),),
                                                    ],
                                                  ),
                                                  /*To be used with like/ dislike/ favouriteRow(
                                                    children: <Widget>[
                                                      condition('${snapshot.data[index].vegOrNon}')==true? new Image.asset('images/non_veg.png',height: 15,width: 15,): new Image.asset('images/veg.jpg',height: 15,width: 15),
                                                      SizedBox(width: 5),
                                                      Text(snapshot.data[index].eventName, style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20,fontFamily: 'Roboto-Black'),)
                                                    ],
                                                  ),*/
                                                  SizedBox(height:10.0),
                                                  Row(
                                                    children: <Widget>[
                                                      new IconTheme(
                                                        data: new IconThemeData(
                                                            color: Colors.black26),
                                                        child: new Icon(Icons.timer,size: 20.0,),
                                                      ),
                                                      Text('${snapshot.data[index].eventPrice}',style: TextStyle(fontWeight: FontWeight.w700,color: Colors.black26),),
                                                    ],
                                                  )
                                                ],
                                              )
                                            ]
                                        ),
                                      )
                                    ]
                                ),
                              )
                            ],
                          ),
                        ),
                      ),
                  ),
                );
              }
            );
          }
      }
    },
  );
}

数据库结构:

Firebase Realtime Database

最后但并非最不重要的是,错误:

I/flutter (17495): NoSuchMethodError: The method '[]' was called on null.
I/flutter (17495): Receiver: null
I/flutter (17495): Tried calling: []("Events")

谢谢您的时间

更新1

根据以下评论中的讨论更改了代码:

更改以下内容:

 funRides rides;
      DataSnapshot snapshot = await databaseReference.once();
      Map<dynamic,dynamic> jsonResponse = snapshot.value[0]['Events'];
      rides = new funRides.fromJson(jsonResponse);
      list.addAll(rides.fRides);

收件人:

try{
      funRides rides;
      databaseReference = FirebaseDatabase.instance.reference().child("0").child("Events");
      databaseReference.once().then((DataSnapshot snap){
        Map<dynamic,dynamic> jsonResponse = snap.value;
        rides = new funRides.fromJson(jsonResponse);
        list.addAll(rides.fRides);
      });

我现在收到以下错误:

E/flutter (25912): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'List<dynamic>' in type cast
E/flutter (25912): #0      funRides.parseRides (package:training/models/fun_rides_short.dart:30:38)
E/flutter (25912): #1      new funRides.fromJson (package:training/models/fun_rides_short.dart:25:15)
E/flutter (25912): #2      MakeCall.firebaseCalls.<anonymous closure> (package:training/services/firebaseListServices.dart:12:21)
E/flutter (25912): #3      _rootRunUnary (dart:async/zone.dart:1132:38)
E/flutter (25912): #4      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
E/flutter (25912): #5      _FutureListener.handleValue (dart:async/future_impl.dart:126:18)
E/flutter (25912): #6      Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:639:45)
E/flutter (25912): #7      Future._propagateToListeners (dart:async/future_impl.dart:668:32)
E/flutter (25912): #8      Future._complete (dart:async/future_impl.dart:473:7)
E/flutter (25912): #9      _SyncCompleter.complete (dart:async/future_impl.dart:51:12)
E/flutter (25912): #10     _AsyncAwaitCompleter.complete (dart:async-patch/async_patch.dart:28:18)
E/flutter (25912): #11     _completeOnAsyncReturn (dart:async-patch/async_patch.dart:294:13)
E/flutter (25912): #12     Query.once (package:firebase_database/src/query.dart)
E/flutter (25912): <asynchronous suspension>
E/flutter (25912): #13     MakeCall.firebaseCalls (package:training/services/firebaseListServices.dart:10:25)
E/flutter (25912): <asynchronous suspension>
E/flutter (25912): #14     new HomeScreen (package:training/Screens/HomeScreen.dart:76:23)
E/flutter (25912): #15     Home.createState (package:training/Screens/HomeScreen.dart:10:46)
E/flutter (25912): #16     new StatefulElement (package:flutter/src/widgets/framework.dart:3989:25)
E/flutter (25912): #17     StatefulWidget.createElement (package:flutter/src/widgets/framework.dart:802:38)
E/flutter (25912): #18     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3082:40)
E/flutter (25912): #19     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #20     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
E/flutter (25912): #21     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
E/flutter (25912): #22     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #23     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
E/flutter (25912): #24     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
E/flutter (25912): #25     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
E/flutter (25912): #26     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
E/flutter (25912): #27     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
E/flutter (25912): #28     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #29     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
E/flutter (25912): #30     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
E/flutter (25912): #31     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #32     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
E/flutter (25912): #33     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
E/flutter (25912): #34     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #35     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
E/flutter (25912): #36     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
E/flutter (25912): #37     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #38     SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5092:14)
E/flutter (25912): #39     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3084:14)
E/flutter (25912): #40     Element.updateChild (package:flutter/src/widgets/framework.dart:2887:12)
E/flutter (25912): #41     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:3935:16)
E/flutter (25912): #42     Element.rebuild (package:flutter/src/widgets/framework.dart:3721:5)
E/flutter (25912): #43     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:3907:5)
E/flutter (25912): #44     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4053:11)
E/flutter (25912): #45     ComponentElement.mount (package:flutter/src/widgets/framework.dart:3902:5)
E/flutter (25912): #46     Element.inflateWidget (package:flutter/s

更新2

try{
      funRides rides;
      databaseReference = FirebaseDatabase.instance.reference().child("0").child("Events");
      databaseReference.once().then((DataSnapshot snap){
        Map<dynamic,dynamic> jsonResponse = snap.value;
        //rides = new funRides.fromJson(jsonResponse);
        list.addAll(snap.value);
      });

错误:

E/flutter (25912): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Iterable<funRideDetails>'

1 个答案:

答案 0 :(得分:0)

更改此:

      DataSnapshot snapshot = await databaseReference.once();
      Map<dynamic,dynamic> jsonResponse = snapshot.value[0]['Events'];

对此:

db = FirebaseDatabase.instance.reference().child("0").child("Events");
db.once().then((DataSnapshot snapshot){
  Map<dynamic, dynamic> values = snapshot.value;
     values.forEach((key,values) {
      print(values["event_price"]);
    });
 });

这里首先在子事件上添加引用,然后使用forEach在地图内循环并获取值,例如event_price

https://api.dartlang.org/stable/2.0.0/dart-core/Map/operator_get.html

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/firebase_database/example/lib/main.dart