如何根据第一个下拉菜单中选择的选项制作DropDown选项

时间:2019-05-11 19:27:39

标签: flutter

我有两个下拉菜单。第一个选择国家的许可证,第二个选择依赖国家的城市。 两者都是在不同文件中构建的小部件,但在另一个相同文件中使用。 我的困难:当我调用城市小部件以使用它来检索所选国家/地区的城市时,如何检索国家/地区的选择以及如何进行传递,因为此小部件中未声明我的变量_maselectionpays包含国家/地区的选择

                          //debut
                 Listepayswidget(),
                 Listevillewidget(pays:_maselectionpays),

编辑:

我的小工具国家/地区代码(付款)

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';


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

  @override
  State<StatefulWidget> createState() => new _ListepayswidgetState();

}
class _ListepayswidgetState extends State<Listepayswidget> {

   String _maselectionpays;
   List data=List();
  //List _allville= new List();
   Future<String> getpays() async {
  // paradisimo.000webhostapp.com
  final response = await http.post(ressource);

  var resbody= json.decode(response.body);
  setState((){
  data=resbody;
   });
  print (resbody);
  return "success";
 //datab=data.toString();
   }

    @override
   void initState(){
    super.initState();
    this.getpays();

}
  @override
   Widget build(BuildContext context) {
   return new Container(

              child: 

              new DropdownButton(


                items: data.map((item){
                  return new DropdownMenuItem(
                    child: new Text(item['libelle_pays']),
                    value: item['code_pays'].toString(),

                  );
                }).toList(),
                onChanged: (newVal){
                  setState(() {
                   _maselectionpays=newVal; 
                  });
                },
                value: _maselectionpays,
              ),
            );




  }
}

小部件城市(维尔)的代码与小部件国家(支付)的代码相似。

这是我调用小部件付费时的statefulwidget代码

import 'package:flutter/material.dart';
import 'package:paradisimmo/utilitaire/combo_offre.dart';
import 'package:paradisimmo/utilitaire/combo_pays.dart';




class EnregistreroffrePage extends StatefulWidget {
   EnregistreroffrePage({this.username});
final String username;
  @override
  State<StatefulWidget> createState() => new _EnregistreroffrePage();
}

class _EnregistreroffreData {
  String email = '';
  String password = '';

}

class _EnregistreroffrePage extends State<EnregistreroffrePage> {
  bool monVal = false;
  bool tuVal = false;
  bool wedVal = false;
  int _radioValue1 = -1;

 void _handleRadioValueChange1(int value) {
    setState(() {
      _radioValue1 = value;

      switch (_radioValue1) {
        case 0:

          //correctScore++;
          break;
        case 1:

          break;
        case 2:

          break;
      }
    });
  }

  final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
  _EnregistreroffreData _data = new  _EnregistreroffreData();

  void submit() {
    // First validate form.
    if (this._formKey.currentState.validate()) {
      _formKey.currentState.save(); // Save our form now.

    }
  }

  @override
  Widget build(BuildContext context) {
    //final Size screenSize = MediaQuery.of(context).size;

    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Enregistrer une offre'),
      ),
        body: Center(
            child: ListView(
              shrinkWrap: true,
              padding: EdgeInsets.all(15.0),
              children: <Widget>[
                Center(
                  child: Card(
                    elevation: 8.0,
                    child: Container(
                      padding: EdgeInsets.all(10.0),
                      child: Column(
                        children: <Widget>[
                           //debut
                  Listepayswidget(),
                  Listevillewidget(pays:_maselectionpays),

1 个答案:

答案 0 :(得分:0)

您需要在输入表单中使用StatefulWidget。选择国家后,触发setState(),这将重建 city 下拉小部件。您可以在StatefulWidget here上找到更多示例。这是来自Google的sample code

  

阅读您新添加的代码,这就是我的想法:

_maselectionpays。也可以从statefullwidget城市(Listevillewidget)访问一个国家。那里是必需的,因此您可以根据国家/地区选择来重建城市。有两种方法可以做到,但是最简单的方法是在maselectionpays中将EnregistreroffrePage设置为变量,然后将其传递给Listepayswidget(maselectionpays)Listevillewidget(maselectionpays)。更改后,您可以在setState内部调用Listepayswidget,并在Listevillewidget的{​​{1}}内部使用它。如果将其用作DropdownButton中的key,则该值当然应该是城市列表,而关键是国家。因此,如果密钥更改,则国家/地区也会更改城市列表。因此Flutter将重新构建该元素。

要对此进行更好的管理,您可以查看BLoC-pattern,因为它的代码较少。或者看一下into RxDart,它使用HashMap<key, value> dataobservables来处理更改,这也使用较少的代码。