将参数传递到Statefull小部件

时间:2020-08-17 19:17:59

标签: flutter

在将参数传递给有状态的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(),

0 个答案:

没有答案