Android 如何在颤振中单击按钮后获取数据?
我正在做一个爱情计算器,因为我是一个新手。但是我正在从api获取数据,并在后端进行计算。但我不能通过点击按钮来完成。请帮我这么做Android 如何在颤振中单击按钮后获取数据?,android,flutter,android-layout,flutter-layout,flutter-test,Android,Flutter,Android Layout,Flutter Layout,Flutter Test,我正在做一个爱情计算器,因为我是一个新手。但是我正在从api获取数据,并在后端进行计算。但我不能通过点击按钮来完成。请帮我这么做 import 'dart:io'; import 'package:AllInOneCalci/CustomTextField.dart'; import 'package:AllInOneCalci/Post.dart'; import 'package:AllInOneCalci/customAppBar.dart'; import 'package:flutt
import 'dart:io';
import 'package:AllInOneCalci/CustomTextField.dart';
import 'package:AllInOneCalci/Post.dart';
import 'package:AllInOneCalci/customAppBar.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
class LoveCalUI extends StatelessWidget {
@override
Widget build(BuildContext context) {
var AppBarHeight = MediaQuery.of(context).size.height;
return Scaffold(
appBar: customAppBar(
height: (AppBarHeight / 3) * 0.4,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(top: 18.0),
child: Text(
'Love Calculator',
style: TextStyle(
color: Colors.black,
fontSize: 35.0,
fontFamily: 'DancingScript',
fontWeight: FontWeight.bold),
),
),
],
),
),
body: CustomFetchData(),
);
}
}
class CustomFetchData extends StatefulWidget {
@override
_CustomFetchDataState createState() => _CustomFetchDataState();
}
class _CustomFetchDataState extends State<CustomFetchData> {
int percentage = 0;
String result = "";
TextEditingController firstNameController = new TextEditingController();
TextEditingController secondNameController = new TextEditingController();
Future<Post> _getData({String name1, String name2}) async {
final response = await http.get(
'https://love-calculator.p.rapidapi.com/getPercentage?fname=$name1&sname=$name2',
headers: {
'x-rapidapi-host': 'love-calculator.p.rapidapi.com',
'x-rapidapi-key':
'84e84770b9msh59a96d8b03cb4aap1615a1jsn1cd0efaeedfe',
});
if (response.statusCode == 200) {
final responseJson = json.decode(response.body);
setState(() {
percentage = int.parse(responseJson['percentage']);
result = responseJson['result'];
});
} else {
throw Exception('Failed to load api');
}
}
Widget ErrorDesign() {
return Padding(
padding: const EdgeInsets.all(20.0),
child: Container(
alignment: Alignment.center,
child: Text(
'Error: Kindly Connect to Internet',
style: TextStyle(
color: Colors.redAccent,
fontFamily: 'DancingScript',
fontSize: 40.0,
fontWeight: FontWeight.bold,
),
),
),
);
}
Widget FetchedCalculationValues() {
return Column(
children: [
Container(
child: FutureBuilder<Post>(
future: _getData(),
builder: (BuildContext context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(
child: Padding(
padding: const EdgeInsets.all(20.0),
child: CircularProgressIndicator(),
),
);
} else {
if (snapshot.hasError) {
return Container(
child: ErrorDesign(),
);
} else {
return Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
Text('Percentage is $percentage %',
style: TextStyle(
color: Colors.black,
)),
Text('Result is: $result',
style: TextStyle(
color: Colors.black,
)),
],
),
);
}
}
})),
],
);
}
@override
Widget build(BuildContext context) {
bool visibilitySwitch = false;
return SingleChildScrollView(
child: Column(
children: [
Padding(
padding: const EdgeInsets.only(left: 18.0, right: 18.0, top: 15.0),
child: CustomTextField('First Name', "", Colors.cyan, Colors.cyan,
Colors.redAccent, firstNameController, firstNameController),
),
Padding(
padding: const EdgeInsets.only(left: 18.0, right: 18.0),
child: CustomTextField(
'Second Name',
"",
Colors.red,
Colors.redAccent,
Colors.cyanAccent,
secondNameController,
secondNameController),
),
Padding(
padding: const EdgeInsets.all(18.0),
child: MaterialButton(
color: Colors.redAccent,
child: Text(
'Result',
style: TextStyle(
color: Colors.white,
),
),
onPressed: () {
_getData(
name1: firstNameController.text,
name2: secondNameController.text,
);
}),
),
Text(
'Your Score Is: $percentage%',
style: TextStyle(
color: Colors.redAccent,
fontSize: 25.0,
fontWeight: FontWeight.bold,
),
),
Padding(
padding: const EdgeInsets.all(18.0),
child: Text(
'$result',
style: TextStyle(
color: Colors.redAccent,
fontFamily: 'DancingScript',
fontSize: 30.0,
fontWeight: FontWeight.bold,
),
),
),
],
),
);
}
@override
// ignore: must_call_super
void initState() {
_getData();
}
}
导入'dart:io';
导入“package:AllInOneCalci/CustomTextField.dart”;
进口“包装:Allinonecali/Post.dart”;
进口“包装:AllInOneCalci/customAppBar.dart”;
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
导入“dart:async”;
类LoveCalUI扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
var AppBarHeight=MediaQuery.of(context).size.height;
返回脚手架(
appBar:customAppBar(
高度:(AppBarHeight/3)*0.4,
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
填充物(
填充:仅限常量边集(顶部:18.0),
子:文本(
“爱情计算器”,
样式:TextStyle(
颜色:颜色,黑色,
字体大小:35.0,
fontFamily:“DancingScript”,
fontWeight:fontWeight.bold),
),
),
],
),
),
正文:CustomFetchData(),
);
}
}
类CustomFetchData扩展StatefulWidget{
@凌驾
_CustomFetchDataState createState()=>\u CustomFetchDataState();
}
类_CustomFetchDataState扩展状态{
整数百分比=0;
字符串结果=”;
TextEditingController firstNameController=新的TextEditingController();
TextEditingController secondNameController=新的TextEditingController();
Future_getData({String name1,String name2})异步{
最终响应=等待http.get(
'https://love-calculator.p.rapidapi.com/getPercentage?fname=$name1&sname=$name2',
标题:{
“x-rapidapi-host”:“love calculator.p.rapidapi.com”,
“x-rapidapi-key”:
“84e84770b9msh59a96d8b03cb4aap1615a1jsn1cd0efaeedfe”,
});
如果(response.statusCode==200){
final responseJson=json.decode(response.body);
设置状态(){
percentage=int.parse(responseJson['percentage']);
result=responseJson['result'];
});
}否则{
抛出异常(“加载api失败”);
}
}
小部件错误设计(){
返回填充(
填充:常数边集全部(20.0),
子:容器(
对齐:对齐.center,
子:文本(
“错误:请连接到Internet”,
样式:TextStyle(
颜色:Colors.redAccent,
fontFamily:“DancingScript”,
字体大小:40.0,
fontWeight:fontWeight.bold,
),
),
),
);
}
小部件FetchedCalculationValues(){
返回列(
儿童:[
容器(
孩子:未来建设者(
未来:_getData(),
生成器:(BuildContext上下文,快照){
if(snapshot.connectionState==connectionState.waiting){
返回中心(
孩子:填充(
填充:常数边集全部(20.0),
子对象:CircularProgressIndicator(),
),
);
}否则{
if(snapshot.hasError){
返回容器(
子项:ErrorDesign(),
);
}否则{
返回填充(
填充:常数边集全部(20.0),
子:列(
儿童:[
文本(“百分比为$Percentage%”,
样式:TextStyle(
颜色:颜色,黑色,
)),
Text('结果为:$Result',
样式:TextStyle(
颜色:颜色,黑色,
)),
],
),
);
}
}
})),
],
);
}
@凌驾
小部件构建(构建上下文){
布尔可视性开关=假;
返回SingleChildScrollView(
子:列(
儿童:[
填充物(
填充:仅限常量边集(左:18.0,右:18.0,顶:15.0),
子项:CustomTextField('名字','',Colors.cyan,Colors.cyan,
Colors.redAccent、firstNameController、firstNameController),
),
填充物(
填充:仅限常量边集(左:18.0,右:18.0),
子项:CustomTextField(
“第二个名字”,
"",
颜色,红色,
颜色,红色口音,
颜色。青色口音,
第二名控制员,
第二名控制器),
),
填充物(
填充:常数边集全部(18.0),
子:材质按钮(
颜色:Colors.redAccent,
子:文本(
“结果”,
样式:TextStyle(
颜色:颜色,白色,
),
),
已按下:(){
_获取数据(
name1:firstNameController.text,
name2:secondNameController.text,
);
}),
),
正文(
“您的分数为:$percentage%”,
样式:TextStyle(
颜色:Colors.redAccent,
字体大小:25.0,
fontWeight:fontWeight.bold,
),
),
填充物(
填充:常数边集全部(18.0),
子:文本(
“$result”,
onPressed: () async{
await _getData(
name1:firstNameController.text,
name2:secondNameController.text,
);
}
showAlertDialog(BuildContext context){
AlertDialog alert=AlertDialog(
content: new Row(
children: [
CircularProgressIndicator(),
Container(margin: EdgeInsets.only(left: 5),child:Text("Loading" )),
],),
);
showDialog(barrierDismissible: false,
context:context,
builder:(BuildContext context){
return alert;
},
);
}
onPressed: () async{
showAlertDialog(context);
await _getData(
name1:firstNameController.text,
name2:secondNameController.text);
Navigator.pop(context)//popping the dialog after data is fetched
}
bool isLoaded=false;
_getText(){
if(isLoaded){
return Text("your percentage is..$percentage");
}else{
return Container ();// an empty container.
}
}
onPressed: () async{
showAlertDialog(context);
await _getData(
name1:firstNameController.text,
name2:secondNameController.text);
Navigator.pop(context)//popping the dialog after data is fetched
setState((){
isLoaded=true;
});