“方法'call'被调用为null。”在Flutter

时间:2020-08-02 23:43:22

标签: android flutter dart mobile

我正在尝试从子窗口小部件touchedIndex中提取值PieChartWidget,我必须使用fl_chart制作一个中间有孔的饼图到其父窗口小部件{{1 }}让我在饼图的中间创建一些文本,当按下饼图的一部分时,这些文本会发生变化。这将返回一个错误,但是除了饼图段之外,其他所有内容在视觉上都不会扩展。为了简化调试,我将Co2Tracker替换为setState(){isTouched = isTouchedNew},但这仍然返回下面的错误,但是,饼图现在扩展。

PieChart example

使用回调函数时

print(isTouchedNew)

集成到有状态的小部件中,我得到的输出

int isTouched = -1;
setIsTouched(int isTouchedNew) {
  print(isTouchedNew);
}

父主页

════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
The method 'call' was called on null.
Receiver: null
Tried calling: call(-1)

儿童饼图小工具

class Co2Tracker extends StatefulWidget {
  @override
  _Co2TrackerState createState() => _Co2TrackerState();
}

class _Co2TrackerState extends State<Co2Tracker> {

  List<String> pieNames = ['Travel', 'Gas', 'Electricity', 'Food shop', 'Water',];

  int isTouched = -1;
  double radiusNormal = 60;
  double centerRadius = 50;
  double radiusExpansion = 1.2;

  setIsTouched(int isTouchedNew) {
    print(isTouchedNew);
  }

  @override
  Widget build(BuildContext context) {

    //double co2 = ModalRoute.of(context).settings.arguments;

    return Scaffold(
      appBar: appBarTemplate('CO\u2082 Tracker'),
      body: Column(
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 15),
            child: textStyleTemplateLarge(text: 'Your CO\u2082 emissions today', textColor: Colors.green[400]),
          ),
          AspectRatio(
            aspectRatio: 200/((radiusExpansion*radiusNormal) + centerRadius),
            child: Row(
              children: <Widget>[
                Expanded(
                  child: Stack(
                    children: <Widget>[
                      Center(
                        child: FlatButton(child: textStyleTemplateLarge(text: '70kg', textColor: Colors.black),),
                      ),
                      Center(
                          child: PieChartWidget(radiusNormal: radiusNormal, centerRadius: centerRadius, radiusExpanded: (radiusExpansion*radiusNormal), pieNames: pieNames,),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

到目前为止,我一直认为可能与变量的初始化有关,或者与子页面第43行中的import 'package:flutter/material.dart'; import 'package:fl_chart/fl_chart.dart'; class PieChartWidget extends StatefulWidget { final double radiusNormal; final double radiusExpanded; final double centerRadius; final double fontSizeNormal; final double fontSizeExpanded; final List<String> pieNames; final Function(int) setIsTouched; PieChartWidget({this.radiusNormal, this.radiusExpanded, this.centerRadius, this.fontSizeNormal, this.fontSizeExpanded, this.pieNames, this.setIsTouched}); @override _PieChartWidgetState createState() => _PieChartWidgetState(radiusNormal: radiusNormal, radiusExpanded: radiusExpanded, centerRadius: centerRadius, fontSizeNormal: fontSizeNormal, fontSizeExpanded: fontSizeExpanded, pieNames: pieNames, setIsTouched: setIsTouched,); } class _PieChartWidgetState extends State<PieChartWidget> { int touchedIndex = -1; double radiusNormal; double radiusExpanded; double centerRadius; double fontSizeNormal; double fontSizeExpanded; List<String> pieNames; Function(int) setIsTouched; _PieChartWidgetState({this.radiusNormal = 50, this.radiusExpanded = 60, this.centerRadius = 40, this.fontSizeNormal = 16, this.fontSizeExpanded = 25, this.pieNames, this.setIsTouched,}); @override Widget build(BuildContext context) { return PieChart( PieChartData( sections: pieSections(pieNames), borderData: FlBorderData(show: false), sectionsSpace: 0, centerSpaceRadius: centerRadius, pieTouchData: PieTouchData(touchCallback: (pieTouchResponse) { setState(() { if (pieTouchResponse.touchInput is FlLongPressEnd || pieTouchResponse.touchInput is FlPanEnd) { touchedIndex = -1; } else { touchedIndex = pieTouchResponse.touchedSectionIndex; } }); widget.setIsTouched(touchedIndex); }), ), ); } -----------------I-think-everything-below-this-is-irrelevant-but-I-could-be-wrong------------------------------------------- List<PieChartSectionData> pieSections(List<String> pieNames,) { return List.generate(5, (i) { final isTouched = i == touchedIndex; final double fontSize = isTouched ? 25 : 16; final double radius = isTouched ? radiusExpanded : radiusNormal; final int colorNumber = (1+i) * 100; final List<double> valueList = [20, 10, 10, 20, 30]; final double total = valueList.fold(0, (a, b) => a+b); switch (i) { case 0: return sectionData(valueList[i], Colors.pink[300], title(isTouched, valueList[i], total, pieNames[i]), radius, fontSize); case 1: return sectionData(valueList[i], Colors.blue[600], title(isTouched, valueList[i], total, pieNames[i]), radius, fontSize); case 2: return sectionData(valueList[i], Colors.amber[300], title(isTouched, valueList[i], total, pieNames[i]), radius, fontSize); case 3: return sectionData(valueList[i], Colors.purple[300], title(isTouched, valueList[i], total, pieNames[i]), radius, fontSize); case 4: return sectionData(valueList[i], Colors.blue[300], title(isTouched, valueList[i], total, pieNames[i]), radius, fontSize); default: return null; } }); } PieChartSectionData sectionData(double value, Color color, String title, double radius, double fontSize,){ return PieChartSectionData( value: value, color: color, title: title, radius: radius, titleStyle: TextStyle(color: Colors.black, fontSize: fontSize, fontWeight: FontWeight.bold), ); } String title(bool isTouched, double value, double total, String title,) { return isTouched ? '${double.parse((value/total*100).toStringAsFixed(2))}%' : '$title'; } } 函数有关,但到目前为止还没有运气。 预先感谢您的宝贵时间。

2 个答案:

答案 0 :(得分:0)

问题是当您打印整数时。

setIsTouched(int isTouchedNew) { print(isTouchedNew); }

您应该这样打印

print("${isTouchedNew}")

答案 1 :(得分:0)

嗯..不确定是否尝试过此操作

int isTouched = -1;


setIsTouched(int isTouchedNew) {
setState(() {

isTouched=isTouchedNew;
  print(isTouchedNew);
}
}