需要帮助...我已经尝试大约一年了,以尝试使这一逻辑正确。我正在尝试从Firebase实时数据库中将信息和1张图像加载到Flutter应用程序listview中。但是我遇到了很多问题,而我最近的问题最严重。
请参见下面的代码:
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),),
],
)
],
)
]
),
)
]
),
)
],
),
),
),
),
);
}
);
}
}
},
);
}
数据库结构:
最后但并非最不重要的是,错误:
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>'
答案 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