[英]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
使用它。 會使用它作為一個key
的HashMap<key, value> data
,數值當然會成為城市的名單,關鍵是國家。 因此,如果密鑰發生變化,則國家/地區然后城市列表也會發生變化。 因此 Flutter 會重新構建元素。
為了更好地管理這一點,您應該查看BLoC-pattern ,它的代碼更少。 或者查看RxDart ,它使用observables
和Streams
來處理更改,這也使用更少的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.