在将参数传递给有状态的Widget方面,我遇到了麻烦。我有3个类,第一个是BrandScreens,它从firebase读取数据并将其显示在屏幕上。第二个是车辆数据,该数据用于处理要显示在BrandsScreens上的数据,并且一旦用户选择了汽车品牌,它会将该汽车上所有可用的模型传递到menuModel类中。但是,当数据位于第二类(车辆数据)上时,我可以使用内联调试查看每个模型,但是当我将其传递给第三类(menuModel)时,carModel变为null。以下是3个类中的每个代码。 预先感谢。
BrandsScreens.dart
import 'package:flutter/material.dart';
import 'package:gerente_loja/core/services/api.dart';
import 'package:gerente_loja/core/services/vehicle_data.dart';
import 'package:gerente_loja/ui/screens/proforma_screen.dart';
import 'package:gerente_loja/ui/widgets/DropDownModel.dart';
class BrandsScreens extends StatelessWidget {
String user;
BrandsScreens(this.user);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Selecionar o Carro '),
//centerTitle: TextAlign.center,
backgroundColor: Colors.brown[500],
centerTitle: true,
actions: [
Text(user != '' ? user.toUpperCase() : 'No Logged User'),
]
),
backgroundColor: Colors.grey,
body: Center(
child: FutureBuilder(
future: Api('vehicle').getDataColletions(),
builder: (context, snapshot){
if (!snapshot.hasData){
return Container(
alignment: Alignment.center,
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(
Colors.blueGrey),
),
);
}
else {
return ListView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, index){
vehicleData data = vehicleData.fromDocument(snapshot.data.documents[index]);
return Container(
padding: EdgeInsets.symmetric(horizontal: 20.0),
child: InkWell(
splashColor: Colors.blueGrey,
child: Card(
//color: Colors.blueGrey,
child: ListTile(
leading: AspectRatio(
aspectRatio: 0.8,
child: Image.network(
data.images,
//snapshot.data.documents['icon'],
height: 500,
//width: 300,
fit: BoxFit.contain,
)
),
title: Text(
data.make,
// snapshot.data.documents['make'],
textAlign: TextAlign.start,
style: TextStyle(fontSize: 18.0,
fontWeight: FontWeight.bold,),
),
onTap: (){
Navigator.push(context, MaterialPageRoute(builder: (context) =>
ProformaScreen(data.make),
// ProformaScreen(snapshot.data.documents['make']),
),
);
// print( snapshot.data.documents['model'];
data.modelData(snapshot.data.documents[index]);
} ,
),
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.blueGrey),
borderRadius: BorderRadius.circular(10),
),
),
),
);
},
);
}
}
),
),
);
}
}
vehicleData.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'dart:core';
import 'package:gerente_loja/ui/widgets/DropDownModel.dart';
import 'package:stacked/stacked.dart';
class vehicleData {
String make;
String images;
Key car;
var model;
//DocumentSnapshot _documentSnapshot;
int index = 0;
vehicleData.fromDocument(DocumentSnapshot snapshot){
try {
// index = snapshot.data.length;
make = snapshot.data['make'];
images = snapshot.data['icon'];
}
catch (e) {
print(e);
}
}
modelData(DocumentSnapshot snapshot){
try {
snapshot.data.forEach((key,value) {
if ( key == 'model'){
//print (value);
model = value;
print('Am passing this Car Model \n');
print(model);
menuModel(model);
return model;
}
});
}
catch (e){
print (e);
}
}
}
menuModel.dart
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:gerente_loja/core/services/vehicle_data.dart';
class menuModel extends StatefulWidget {
final carModel;
const menuModel(this.carModel);
@override
_menuModelState createState() => _menuModelState();
}
class _menuModelState extends State<menuModel> {
// var carModelState;
@override
Widget build(BuildContext context) {
// final carModel = context.inheritFromWidgetOfExactType(menuModel(carModel));
String selectModel;
return Padding(
padding: const EdgeInsets.only(left: 16.0, right: 16.0),
child: Container(
decoration: BoxDecoration(border: Border.all(color: Colors.black),
borderRadius: BorderRadius.circular(25.0)
),
padding: EdgeInsets.only(left: 50.0, right: 16.0),
child: DropdownButton(
hint: Text('Ano'),
dropdownColor: Colors.transparent,
elevation: 5,
icon: Icon(Icons.arrow_drop_down),
isExpanded: true,
iconSize: 36.0,
value: selectModel,
onChanged: (value){
setState(() {
selectModel = value;
});
},
items: widget.carModel.map((value) {
return DropdownMenuItem (
value: value,
child: Text(value));
}).toList(),
),
),
);
}
}
现在,我调用vehicleData类来传递从brands_Screens获取的数据
onTap: (){
Navigator.push(context, MaterialPageRoute(builder: (context) =>
ProformaScreen(data.make),
// ProformaScreen(snapshot.data.documents['make']),
),
);
// print( snapshot.data.documents['model'];
data.modelData(snapshot.data.documents[index]);
} ,
在vehicleData上,我有一个方法modelData来处理汽车的Model并将其传递给combobox(DropDownMenu)的menumodel。但是,在“调试”中,将其传递给另一个menuModel类后,我可以在此处看到每辆车的模型。在那里我得到空值。
modelData(DocumentSnapshot snapshot){
try {
snapshot.data.forEach((key,value) {
if ( key == 'model'){
//print (value);
model = value;
print('Am passing this Car Model \n');
print(model);
menuModel(model);
return model;
}
});
}
catch (e){
print (e);
}
}
最后,这是我希望看到所选汽车模型的地方。
class menuModel extends StatefulWidget {
final carModel;
menuModel(this.carModel);
items: widget.carModel.map((value) {
return DropdownMenuItem (
value: value,
child: Text(value));
}).toList(),