Android 如何在颤振中单击按钮后获取数据?

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

我正在做一个爱情计算器,因为我是一个新手。但是我正在从api获取数据,并在后端进行计算。但我不能通过点击按钮来完成。请帮我这么做

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;

});