我有两个下拉菜单。第一个选择国家的许可证,第二个选择依赖国家的城市。 两者都是在不同文件中构建的小部件,但在另一个相同文件中使用。 我的困难:当我调用城市小部件以使用它来检索所选国家/地区的城市时,如何检索国家/地区的选择以及如何进行传递,因为此小部件中未声明我的变量_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),
答案 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> data
和observables
来处理更改,这也使用较少的代码。