【问题标题】:How to show the fetched data from api on a button click in flutter?如何在颤动中单击按钮时显示从 api 获取的数据?
【发布时间】:2020-12-17 16:22:30
【问题描述】:

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

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 天开始就开始学习扑扑。帮助我,以便我可以快速学习它。此外,flutter 的社区发展迅速,所以我很容易不等待响应。谢谢。

【问题讨论】:

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


    【解决方案1】:

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

    编写此代码应了解的关键概念是 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'),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-18
      • 2021-06-16
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多