[英]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.