【问题标题】:This function has a return type of 'int', but doesn't end with a return statement此函数的返回类型为“int”,但不以 return 语句结束
【发布时间】:2021-06-06 17:23:19
【问题描述】:

警告:

This function has a return type of 'int', but doesn't end with a return statement.  Try adding a return statement, or changing the return type to 'void'.

我在这段代码中收到警告:

int _duration = 0;
  int getDuration(String date) {
    //print("Date $date");
    //load the data from firebase and add to the list
    fb.reference()
      ..child(cuser.uid)
          .child('Seizure_history')
          .child(date)
          .once()
          .then((DataSnapshot snapshot) {
        var data = snapshot.value;
        list = List();
        if (data != null) {
          data.forEach((key, value) {
            EventList seizure_history = new EventList(
              seiz_duration: value['duration'],
              dateTime: value['datetime'],
              key: key,
            );
            list.add(seizure_history);
            setState(() {
              _duration = int.parse(list[list.length - 1].seiz_duration);
            });
            print("Duration $_duration");
            return _duration;
          });
        }
      });
  }

我也返回了持续时间,但它仍然显示警告,请帮助我哪里出错了?它在控制台上正确打印持续时间但没有返回。

我想在firebase中找到它后返回持续时间,但它仍然显示为零,这意味着没有返回值,为什么会发生。我是 Flutter 新手,还在学习中。

更新:

这个函数在initState()内部调用:

var series;
  var data;
  //Charts
  getCharts()
  {
    data = [
      addcharts(sevenDay.substring(0, 2), getDuration(seven),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
      addcharts(sixDay.substring(0, 2), getDuration(six),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
      addcharts(fiveDay.substring(0, 2),getDuration(five),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
      addcharts(fourDay.substring(0, 2), getDuration(four),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
      addcharts(threeDay.substring(0, 2), getDuration(three),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
      addcharts(twoDay.substring(0, 2), getDuration(two),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
      addcharts(oneDay.substring(0, 2), getDuration(one),
          charts.ColorUtil.fromDartColor(const Color(0xffe8e5af))),
    ];
    series = [
      charts.Series(
        domainFn: (addcharts addcharts, _) => addcharts.weeks,
        measureFn: (addcharts addcharts, _) => addcharts.duration,
        colorFn: (addcharts addcharts, _) => addcharts.barColor,
        id: 'addcharts',
        data: data,
      ),
    ];

  }

我怎样才能在里面使用future Builder?如果我使用 FutureBuilder,这就是我卡住的地方

Expanded(
                                child: charts.BarChart(
                                  series,
                                  animationDuration: Duration(microseconds: 2000),
                                ),
                              )

【问题讨论】:

  • 您将在 if 块内返回 Duration 实例,该实例又位于快照 (then()) 内,然后在 forEach 循环内,最好使用一些默认持续时间,在 if 块中更新它并返回相同的变量或使用回调。
  • @DarShan 不要只选择变量名。

标签: flutter dart


【解决方案1】:

首先,您应该在异步方法中进行异步计算:

// Return a Future<int> and add async to its declaration
Future<int> getDuration(String date) async {
  final DataSnapshot snapshot = await (fb.reference()
    ..child(cuser.uid)
    .child('Seizure_history')
    .child(date)
    .once());

  var data = snapshot.value;

  // Return a default value in case `snapshot.value` is null
  if (data == null) return 0;

  list = [];
  data.forEach((key, value) {
    final EventList seizure_history = new EventList(
      seiz_duration: value['duration'],
      dateTime: value['datetime'],
      key: key,
    );
    list.add(seizure_history);
    setState(() {
        _duration = int.parse(list[list.length - 1].seiz_duration);
    });
    return _duration;
  });
}

但是,您的逻辑没有意义。您试图在 for-each 中返回一个值 (_duration),因此有两种可能性:1) 您希望从 data 返回第一个持续时间;或 2) 您想从 data 返回所有持续时间。以下是您在这两种情况下的做法:

  1. data 返回第一个持续时间
Future<int> getDuration(String date) async {
  // ...

  list = [];

  // Get the first entry from data
  var entry = data.first;

  final EventList seizure_history = EventList(
    seiz_duration: entry.value['duration'],
    dateTime: entry.value['datetime'],
    key: entry.key,
  );
  list.add(seizure_history);

  // Get the seizure duration
  final int duration = int.parse(seizure_history.seiz_duration);
  setState(() => _duration = duration);
  return duration;
}
  1. data返回所有持续时间
// Since there are multiple durations, use a List<int> instead of int
final List<int> _durations = [];

// Update the method signature
Future<List<int>> getDuration(String date) async {
  // ...

  // Create a local `_durations` to update the property's one only once  
  final List<int> durations = [];

  // Use a map to fetch all the durations
  list = data.map((key, value) {
    final EventList seizure_history = new EventList(
      seiz_duration: value['duration'],
      dateTime: value['datetime'],
      key: key,
    );

    // Add the duration to the local's one
    durations.add(int.parse(seizure_history.seiz_duration);

    // Add the seizure history to the list
    return seizure_history;
  }).toList();

  setState(() => _durations = durations);
  return durations;
}

当然,您需要更改在哪里调用 getDuration,因为现在它返回 Future,但您可以使用 FutureBuilder widget 来帮助您。

【讨论】:

  • 嗨!谢谢你的解决方案。但是你能帮我看看如何用flutter_charts实现未来的构建器,因为我正在制作一个条形图并且我在使用图表的地方调用getDuration()函数
  • 我明白你使用 FutureBuilder 的意义,但你能否提供一个解决方案,说明如何用图表实现它,我已经更新了我的帖子
【解决方案2】:

您只需要在函数末尾返回一个 int,如下所示:

int getDuration(String date) {
    //print("Date $date");
    //load the data from firebase and add to the list
    fb.reference()
      ..child(cuser.uid)
          .child('Seizure_history')
          .child(date)
          .once()
          .then((DataSnapshot snapshot) {
        var data = snapshot.value;
        list = List();
        if (data != null) {
          data.forEach((key, value) {
            EventList seizure_history = new EventList(
              seiz_duration: value['duration'],
              dateTime: value['datetime'],
              key: key,
            );
            list.add(seizure_history);
            setState(() {
              _duration = int.parse(list[list.length - 1].seiz_duration);
            });
            print("Duration $_duration");
            return _duration;
          });
        }
      });
    return 0;
  }

错误来自这样一个事实,当你定义你的函数时,你说它将返回一个 int 类型,但如果条件不满足,它将不返回任何内容(因此,不要返回 @987654323 @)

【讨论】:

  • 您的答案是错误的,因为使用您的代码getDuration 将始终返回 0,这不是 OP 想要的(“我想在 firebase 中找到它后返回持续时间,但它仍然显示为零” )。
【解决方案3】:

您还需要返回int,以防您的Future 失败。

int getDuration(String date) {
  fb.reference(...);
  
  return 0; // Return something here. 
}

将您的返回类型更改为int?

int? getDuration(String date) {...}

【讨论】:

  • 我不能使用不可为空的语言
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2019-05-09
  • 2019-06-19
相关资源
最近更新 更多