簡體   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