如何在单击按钮时显示从api中获取的数据?

时间:2020-08-28 17:56:12

标签: android api flutter flutter-layout flutter-test

我想在单击按钮后显示获取的爱情计算器数据,但如何显示?请回答

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(
                'All In One Cali',
                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> {
  TextEditingController firstNameController = new TextEditingController();
  TextEditingController secondNameController = new TextEditingController();

  Future<Post> getData() async {
    final response = await http.get(
        'https://love-calculator.p.rapidapi.com/getPercentage?fname=aalia&sname=Alice',
        headers: {
          'x-rapidapi-host': 'love-calculator.p.rapidapi.com',
          'x-rapidapi-key':
              '84e84770b9msh59a96d8b03cb4aap1615a1jsn1cd0ef******',
        });

    if (response.statusCode == 200) {
      return Post.fromJson(json.decode(response.body));
    } 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 DisplayData(String percentageValue, String result) {
    return Padding(
      padding: const EdgeInsets.all(20.0),
      child: Container(
        height: 100.0,
        color: Colors.black,
        child: Column(
          children: [
            Text('Percentage is $percentageValue',
                style: TextStyle(
                  color: Colors.white,
                )),
            Text('Result is: $result',
                style: TextStyle(
                  color: Colors.white,
                )),
          ],
        ),
      ),
    );
  }

  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 DisplayData(
                          snapshot.data.percentage, snapshot.data.result);
                    }
                  }
                })),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Padding(
          padding: const EdgeInsets.only(left: 18.0, right: 18.0, top: 15.0),
          child: CustomTextField('First Name', "", Colors.cyan,
              Colors.cyanAccent, Colors.redAccent, firstNameController),
        ),
        Padding(
          padding: const EdgeInsets.only(left: 18.0, right: 18.0),
          child: CustomTextField('Second Name', "", Colors.red,
              Colors.redAccent, Colors.cyanAccent, secondNameController),
        ),
        Padding(
          padding: const EdgeInsets.all(18.0),
          child: MaterialButton(
              color: Colors.redAccent,
              child: Text(
                'Result',
                style: TextStyle(
                  color: Colors.white,
                ),
              ),
              onPressed: () {
                FetchedCalculationValues();
                print('Fetch Calling');
              }),
        ),
        Visibility(
          visible: false,
          child: FetchedCalculationValues(),
          ),
      ],
    );
  }

  @override
  // ignore: must_call_super
  void initState() {
    getData();
  }
}

单击按钮后如何使api调用功能在屏幕上可见。 我也想使用文本字段的值代替默认值 你能解决我的问题吗?如果这样做,将非常有帮助。我是新手,从15天开始学习动摇。帮助我,以便我可以快速学习它。另外,扑扑社区正在迅速发展,因此对我而言,不等待响应就变得很容易。谢谢。

1 个答案:

答案 0 :(得分:0)

我创建了简化的单屏应用程序,但没有任何其他功能来完全解决您的问题。它包含两个文本字段,两个用于显示API结果的文本小部件和一个用于发出请求的浮动操作按钮。

Screenshot

制作此代码应了解的关键概念是http requestsasynchronous coding。这些链接是您了解实际发生情况的良好起点

总结您到底需要什么:

  1. 您可以使用async函数前面的await关键字和http.get()关键字将请求异步发送到API声明函数。这使您可以在不冻结应用程序的情况下等待请求的结果

  2. 结果返回时,将执行_getNames()函数的其余部分,其中包括setState()setState()重建您的小部件并更新Text()小部件中的值

完整代码:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int percentage = 0;
  String resultString = "";

  Map<String, String> requestHeaders = {
    'x-rapidapi-host': 'love-calculator.p.rapidapi.com',
    'x-rapidapi-key': 'your API key',
  };

  final name1Controller = TextEditingController();
  final name2Controller = TextEditingController();

  void _getNames({String name1, String name2}) async {
    final response = await http.get(
      'https://love-calculator.p.rapidapi.com/getPercentage?fname=$name1&sname=$name2',
      // Send authorization headers to the backend.
      headers: requestHeaders,
    );

    final responseJson = json.decode(response.body);

    setState(() {
      percentage = int.parse(responseJson['percentage']);
      resultString = responseJson['result'];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: name1Controller,
              decoration: InputDecoration(
                hintText: "name 1",
              ),
            ),
            TextField(
              controller: name2Controller,
              decoration: InputDecoration(
                hintText: "name 2",
              ),
            ),
            SizedBox(
              height: 10,
            ),
            Text(
              'Your Score is: $percentage',
            ),
            Text(
              '$resultString',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _getNames(
            name1: name1Controller.text,
            name2: name2Controller.text,
          );
        },
        tooltip: 'Increment',
        child: Text('Go'),
      ),
    );
  }
}