颤振显示错误未定义操作

时间:2020-05-05 14:36:39

标签: flutter dart

我以前是在构建一个简单的应用程序,我在应用程序中使用了一个硬编码的json值,现在我正在从具有相同值的API提取数据,但不知道为什么它在值上显示错误

这是我的代码

class _MyHomePageState extends State<MyHomePage> {

  var _questions = new List<Questions>();

  _getQuestions() {
    API.getUsers().then((response) {
      setState(() {

        Iterable list = json.decode(response.body);
        print(list);
        print(list);
        _questions = list.map((model) => Questions.fromJson(model)).toList();
        print(_questions);
      });
    });
  }
  initState() {
    super.initState();
    _getQuestions();
  }


  int index = 0;
  bool shouldShow = false;

  @override
  Widget build(BuildContext context) {
    int size = _questions.length;

    void nextQuestion() {
      if (index < size - 1)
        setState(() {
          index++;
        });
      print(index);
    }

    double percentage1Calculate() {
      int wouldClick = int.parse(_questions[index]['wouldClick']);
      int ratherClick = int.parse(_questions[index]['ratherclick']);
      double percentage1 = wouldClick / (wouldClick + ratherClick) * 100;
      return percentage1;
    }

    double percentage2Calculate() {
      int wouldClick = int.parse(_questions[index]['wouldClick']);
      int ratherClick = int.parse(_questions[index]['ratherClick']);
      double percentage2 = ratherClick / (wouldClick + ratherClick) * 100;
      return percentage2;
    }

    void percengtageTrigger(){
      setState(() {
        shouldShow = true;
      });
      Timer timer = Timer(Duration(milliseconds: 1350), () {
        setState(() {
          shouldShow = false;
        });
      });
    }

    final PrimaryColor = const Color(0xff404040);

    final PreferredSizeWidget appBar = AppBar(
      centerTitle: true,
      title: Text(
        'Would you Rather',
        style: TextStyle(fontFamily: 'FredokaOne'),
      ),
      backgroundColor: PrimaryColor,
    );
    double stackHeight = (MediaQuery.of(context).size.height -
        appBar.preferredSize.height -
        MediaQuery.of(context).padding.top);
    double stackWidth = MediaQuery.of(context).size.width;
    return Scaffold(
        backgroundColor: Color(0xff404040),
        appBar: appBar,

        body: Stack(
          children: [
            GestureDetector(
              onTap: () {
                percengtageTrigger();
              },
              child: Container(
                height: stackHeight * 0.5,
                width: stackWidth,
                color: Colors.blue,
                child: Column(
                  children: <Widget>[
                    shouldShow
                        ? Container(
                            padding: const EdgeInsets.only(top: 10, right: 10),
                            height: stackHeight * 0.1,
                            color: Colors.blue,
                            width: double.infinity,
                            child: Column(
                              mainAxisSize: MainAxisSize.max,
                              crossAxisAlignment: CrossAxisAlignment.end,
                              children: <Widget>[
                                Text(
                                  '${percentage1Calculate().toStringAsFixed(0)}%',
                                  style: TextStyle(
                                    color: Colors.white,
                                    fontSize: 23,
                                    fontFamily: 'NewsCycle',
                                  ),
                                ),
                              ],
                            ))
                        : Container(
                            height: stackHeight * 0.1,
                            color: Colors.blue,
                            width: double.infinity,
                          ),
                    Container(
                        color: Colors.blue,
                        height: stackHeight * 0.4,
                        width: double.infinity,
                        child: Column(
                          children: <Widget>[
                            Padding(
                              padding: const EdgeInsets.only(top: 20),
                              child: Text(
                                _questions[index]['would'],
                                style: TextStyle(
                                  color: Colors.white,
                                  fontSize: 23,
                                  fontFamily: 'NewsCycle',
                                ),
                              ),
                            ),
                          ],
                        )),
                  ],
                ),
              ),
            ),
            GestureDetector(
              onTap: () {
                percengtageTrigger();
              },
              child: Align(
                alignment: Alignment.bottomCenter,
                child: Container(
                  height: stackHeight * 0.5,
                  width: stackWidth,
                  color: Colors.red,
                  child: Column(
                    children: <Widget>[
                      shouldShow
                          ? Container(
                              padding:
                                  const EdgeInsets.only(top: 10, right: 10),
                              height: stackHeight * 0.1,
                              color: Colors.red,
                              width: double.infinity,
                              child: Column(
                                mainAxisSize: MainAxisSize.max,
                                crossAxisAlignment: CrossAxisAlignment.end,
                                children: <Widget>[
                                  Text(
                                    '${percentage2Calculate().toStringAsFixed(0)}%',
                                    style: TextStyle(
                                      color: Colors.white,
                                      fontSize: 23,
                                      fontFamily: 'NewsCycle',
                                    ),
                                  ),
                                ],
                              ))
                          : Container(
                              height: stackHeight * 0.1,
                              color: Colors.red,
                              width: double.infinity,
                            ),
                      Container(
                          color: Colors.red,
                          height: stackHeight * 0.4,
                          width: double.infinity,
                          child: Column(
                            children: <Widget>[
                              Padding(
                                padding: const EdgeInsets.only(top: 40),
                                child: Text(
                                  _questions[index]['rather'],
                                  style: TextStyle(
                                    color: Colors.white,
                                    fontSize: 23,
                                    fontFamily: 'NewsCycle',
                                  ),
                                ),
                              ),
                            ],
                          )),
                    ],
                  ),
                ),
              ),
            ),
            Align(
              alignment: Alignment.center,
              child: Container(
                width: stackWidth,
                height: stackHeight * 0.015,
                color: Color(0xff404040),
              ),
            ),
            Align(
              alignment: Alignment.center,
              child: Container(
                  width: stackWidth,
                  height: stackHeight * 0.15,
                  decoration: BoxDecoration(
                    shape: BoxShape.circle,
                    color: Color(0xff404040),
                  ),
                  child: Align(
                    alignment: Alignment.center,
                    child: GestureDetector(
                      onTap: () {
                        nextQuestion();
                      },
                      child: Text(
                        "SKIP",
                        style: TextStyle(
                            color: Colors.white,
                            fontFamily: 'FredokaOne',
                            fontSize: 27),
                      ),
                    ),
                  )),
            ),
          ],
        ));
  }
}

这是模型。dart

import 'package:flutter/material.dart';

class Questions {
  String would;
  String rather;
  int wouldClick;
  int ratherClick;

  Questions(int wouldClick, int ratherClick, String would, String rather) {
    this.wouldClick = wouldClick;
    this.ratherClick = ratherClick;
    this.would = would;
    this.rather = rather;
  }

  Questions.fromJson(Map json)
      : wouldClick = json['wouldClick'],
        ratherClick = json['ratherClick'],
        would = json['would'],
        rather = json['rather'];

  Map toJson() {
    return {'wouldClick': wouldClick, 'ratherClick': ratherClick, 'would': would, 'rather': rather};
  }
  @override
  String toString() {
    return "{would: $would, rather: $rather, wouldClick: $wouldClick, ratherClick: $ratherClick}";
  }
}

我只是通过索引值显示数据,问题的答案是

[{would: Coffe, rather: Tea, wouldClick: 15, ratherClick: 12}, {would: Soap, rather: Oil, wouldClick: 50, ratherClick: 12}, {would: Shaving Cream, rather: Soap, wouldClick: 15, ratherClick: 12}]

但是当我使用代码中的值时,它显示错误,我使用_questions [index] ['wouldClick']在这里,它显示willClickClick中的错误,即操作未在Question(它的模型)中定义

我认为问题是在API提取数据之前正在加载函数。是否有可能启动该功能或在获取数据后显示该功能?

1 个答案:

答案 0 :(得分:0)

当你调用数据时,把这个 ${_questions[index]['rather']} 而不是 _questions[index]['rather']