Flutter // нажмите кнопку, чтобы выполнить две функции с использованием async и дождаться функции onPressed и получить данные из api
попробуйте поместить какое-то значение в локальную переменную в TextField и onPressed, чтобы получить одну переменную в локальной и вторую переменную, как указано в TextField, и в то же время щелкните onPressed для работы двух функций, одна из которых doSomething другая, функция fetchBalance. Первая функция doSomthig работает правильно, но тело ответа функции fetchBalance печатается успешно, но внутреннее условие не выполняется, но код не получает ошибок в программе. теперь, я застрял на этом, пожалуйста, помогите мне.
Это наши переменные
var _addressControler= TextEditingController();
var url1='This is default variable ';
var url2='noAddress entered';
Первая функция
doSomething(){
setState(() {
if(_addressControler.text == _addressControler.text){
url2 = _addressControler.text.toString();
}else{
url2=url2;
print("$url2");
}
print("$url2");
});
}
Это локальная переменная для баланса
late Future<Balance> futureBalance;
final _formKey = GlobalKey<FormState>();
@override
void initState() {
super.initState();
futureBalance = fetchBalance();
}
Future<Balance> fetchBalance() async {
print("$url1");
print("$url2");
var finalAddress=url1+url2;
print("$finalAddress");
final response =
await http.get(Uri.parse(finalAddress));
print(response.body);
if (response.statusCode == 200) {
return Balance.fromJson(jsonDecode(response.body));
} else {
throw Exception('Failed to load album');
}
}
@override Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.amberAccent,
appBar: AppBar(
title: const Text('Retrieve Text Input'),
),
body: Padding(
key: _formKey,
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(10.0),
child: TextField(
controller: _addressControler,
decoration: InputDecoration(labelText: 'Enter the address...',
labelStyle: TextStyle(color: Colors.blue),border: new OutlineInputBorder(
borderSide:new BorderSide(color: Colors.black)),),
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: ElevatedButton(
onPressed:() async{
doSomething();
await fetchBalance();
},
child: const Text('Submit'),
throw Exception('Failed to load album');
}
}
это наша база пользовательского интерфейса
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.amberAccent,
appBar: AppBar(
title: const Text('Retrieve Text Input'),
),
body: Padding(
key: _formKey,
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(10.0),
child: TextField(
controller: _addressControler,
decoration: InputDecoration(labelText: 'Enter the address...',
labelStyle: TextStyle(color: Colors.blue),border: new OutlineInputBorder(
borderSide:new BorderSide(color: Colors.black)),),
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: ElevatedButton(
onPressed:() async{
doSomething();
await fetchBalance();
},
child: const Text('Submit'),
),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0),
child: Text("$url2"),
),
Container(
child: FutureBuilder<Balance>(
future: futureBalance,
builder: (context, snapshot) {
if (snapshot.hasData) {
print(snapshot.data!.height);
print(snapshot.data!.result[0].amount);
var x = (snapshot.data!.result[0].amount);
var y =int.parse(x);
assert(y is int);
),
],
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
),
),
],
),
)
);
}
}
print(z);
return
Column(
children: [
Padding(
padding: const EdgeInsets.all(16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('${z.toString()}',style: TextStyle(fontSize: 20,),),
],
),
),
],
);
} else if (snapshot.hasError) {
return Text("${snapshot.error}");
}
// By default, show a loading spinner.
return CircularProgressIndicator();
},
),
),
],var _addressControler= TextEditingController();
),
)
);
}
}
2 ответа
работает...
child: ElevatedButton(
onPressed: () {
setState(() {
fetchBalance();
});
fetchBalance();
},
child: const Text('Submit'),
),
),
вам не нужно указывать переменную url2, просто отправьте
_addressControler.text
в
fetchBalance()
Future<Balance> fetchBalance() async {
final response =
await http.get(Uri.parse(url1 +_adressController.text));
if (response.statusCode == 200) {
return Balance.fromJson(jsonDecode(response.body));
} else {
throw Exception('Failed to load album');
}
}