繁体   English   中英

如何根据第一个下拉列表中选择的选项创建一个下拉选项

[英]how make a DropDown option based on option selected in first dropdown

我有两个下拉菜单。 第一个许可证选择国家,第二个许可证取决于国家/地区。 两者都是在不同文件中构建但在另一个相同文件中使用的小部件。 我的困难:当我调用城市小部件以使用它来检索所选国家/地区的城市时,如何检索国家/地区的选择以及如何传输它,因为我的包含国家选择的变量 _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,
              ),
            );




  }
}

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

这是我调用 widget pays 时的 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),

您需要将StatefulWidget用于您的输入表单。 当您选择一个country ,然后触发setState() ,这将重建city下拉小部件。 您可以在此处找到有关StatefulWidget更多示例。 这是来自谷歌的示例代码

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

_maselectionpays .aka 国家需要从 statefullwidget 城市(Listevillewidget)访问。 那里需要它,以便您可以根据国家/地区选择重建城市。 有一对夫妇的这样做的方法,但最简单的就是让maselectionpays内部变量EnregistreroffrePage ,然后将它传递给Listepayswidget(maselectionpays)Listevillewidget(maselectionpays) 当它改变时,你在Listepayswidget调用setState并且你应该在Listevillewidget中的DropdownButton使用它。 会使用它作为一个keyHashMap<key, value> data ,数值当然会成为城市的名单,关键是国家。 因此,如果密钥发生变化,则国家/地区然后城市列表也会发生变化。 因此 Flutter 会重新构建元素。

为了更好地管理这一点,您应该查看BLoC-pattern ,它的代码更少。 或者查看RxDart ,它使用observablesStreams来处理更改,这也使用更少的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM