Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 颤振:将未来作为int传递给图表_Dart_Flutter_Sqflite - Fatal编程技术网

Dart 颤振:将未来作为int传递给图表

Dart 颤振:将未来作为int传递给图表,dart,flutter,sqflite,Dart,Flutter,Sqflite,我正在使用flutter制作一个情绪检查器应用程序,用户从5个表情中选择一个来显示他们的情绪。 我想显示一个PieChart,其中包含数据emoji和它被选择的天数。 问题是,我必须从sqflite数据库中获取数据,以获取numOfDays。选择的特定表情符号将是Future类型,但图表不能接受Future,我尝试使用async await,但它似乎不起作用 错误 情绪模型文件 进口“包装:颤振/材料.省道” class Mood { int _moodID; int _emojiID;

我正在使用flutter制作一个情绪检查器应用程序,用户从5个表情中选择一个来显示他们的情绪。 我想显示一个PieChart,其中包含数据emoji和它被选择的天数。 问题是,我必须从sqflite数据库中获取数据,以获取numOfDays。选择的特定表情符号将是Future类型,但图表不能接受Future,我尝试使用async await,但它似乎不起作用

错误

情绪模型文件

进口“包装:颤振/材料.省道”

class Mood {
  int _moodID;
  int _emojiID;
  int _actID;
  int _moodDay;
  int _moodMonth;
  int _moodYear;

  Mood(this._emojiID, this._moodDay, this._moodMonth, this._moodYear,
      this._actID);

  Mood.withId(this._moodID, this._emojiID, this._moodDay, this._moodMonth,
      this._moodYear, this._actID);

  int get moodID => _moodID;
  int get emojiID => _emojiID;
  int get actID => _actID;
  int get moodDay => _moodDay;
  int get moodMonth => _moodMonth;
  int get moodYear => _moodYear;

// can define setters as well

  Map<String, int> toMap() {
    var map = Map<String, int>();
    if (_moodID != null) {
      map['moodId'] = _moodID;
    }
    map['emojiId'] = _emojiID;
    map['actId'] = _actID;
    map['moodDay'] = _moodDay;
    map['moodMonth'] = _moodMonth;
    map['moodYear'] = _moodYear;
    return map;
  }

  Mood.fromMap(Map<String, int> map) {
    this._moodID = map['moodId'];
    this._emojiID = map['emojiId'];
    this._actID = map['actId'];
    this._moodDay = map['moodMap'];
    this._moodMonth = map['moodMonth'];
    this._moodYear = map['moodYear'];
  }
}
*数据库文件

情绪图表文件片段


我不知道此代码是否运行,因为您的示例代码不完整。 你需要学习dart期货是如何运作的。当您调用它时,结果稍后会像Javascript承诺一样返回

import 'package:flutter/material.dart';
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import '../view/mood.dart';
import '../models/mood_db.dart';
import 'dart:async';

class Mood {
  String _emoji;
  int _numOfDays; // this has to int bcz charts can't take future<int>
  charts.Color _color;

  Mood(this._emoji, this._numOfDays, this._color);
}

class MoodChart extends StatefulWidget {
  @override
  _MoodChartState createState() => _MoodChartState();
}

class _MoodChartState extends State<MoodChart> {
  DatabaseHelper _databaseHelper = DatabaseHelper();
  List<Mood> _data;
  List<charts.Series<Mood, String>> _chartData = null;

  // Here I used async-await but this function still return Future<int>    
  Future<List<int>> numOfDaysFn(List<int> days) async {
    return Future.wait(days.map((d) => _databaseHelper.numOfMoodDays(d)));
  }

  void initData( List<int> idx, List<int> days) {
    setState(() {


      _chartData = List<charts.Series<Mood, String>>();

      _data = <Mood>[
        Mood(
            allMoods[idx[0]-1], days[0], charts.MaterialPalette.red.shadeDefault),
        Mood(allMoods[idx[1]-1], days[1],
            charts.MaterialPalette.blue.shadeDefault),
        Mood(allMoods[idx[2]-1], days[2],
            charts.MaterialPalette.gray.shadeDefault),
        Mood(allMoods[idx[3]-1], days[3],
            charts.MaterialPalette.indigo.shadeDefault),
        Mood(allMoods[idx[4]-1], days[4],
            charts.MaterialPalette.green.shadeDefault),
      ];
      _chartData.add(charts.Series(
        id: 'Mood',
        data: _data,
        colorFn: (Mood mood, _) => mood._color,
        domainFn: (Mood mood, _) => mood._emoji,
        measureFn: (Mood mood, _) => mood._numOfDays, //this can't take futures
      ));
    });
  }

  @override
  void initState() {
    super.initState();
    var months = [1,2,3,4,5];
    numOfDaysFn(months).then((days) {
        initData(months, days);
    });
  }

  @override
  Widget build(BuildContext context) {
     if(_chartData != null ){
      return Container(
        child: charts.PieChart(
          _chartData,
          animate: true,
        ),
      );
    } else {
      return CircularProgressIndicator();
    }
  }
}
修订1

    import 'package:flutter/material.dart';
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import '../view/mood.dart';
import '../models/mood_db.dart';
import 'dart:async';

class Mood {
  String _emoji;
  int _numOfDays; // this has to int bcz charts can't take future<int>
  charts.Color _color;

  Mood(this._emoji, this._numOfDays, this._color);
}

class MoodChart extends StatefulWidget {
  @override
  _MoodChartState createState() => _MoodChartState();
}

class _MoodChartState extends State<MoodChart> {
  DatabaseHelper _databaseHelper = DatabaseHelper();
  List<Mood> _data;
  List<charts.Series<Mood, String>> _chartData = null;

  static List<charts.Color> DEFAULT_SHADE  = [
    null,
    charts.MaterialPalette.red.shadeDefault, 
    charts.MaterialPalette.blue.shadeDefault, 
    charts.MaterialPalette.gray.shadeDefault,
    charts.MaterialPalette.indigo.shadeDefault,
    charts.MaterialPalette.green.shadeDefault];

  Future<Mood> numOfDaysFn(int day) async {
    return Mood(  allMood[day-1] , _databaseHelper.numOfMoodDays(day), DEFAULT_SHADE[day] );
  }
  Future<List<Mood>> returnAllNumOfDaysFn( List<int> days) async {
    return Future.wait(days.map((d) => numOfDaysFn(d)));
  }

  @override
  void initState() {
    super.initState();
    var months = [1,2,3,4,5];
    returnAllNumOfDaysFn(months).then((moods) {
      var temp = charts.Series(
        id: 'Mood',
        data: _data,
        colorFn: (Mood mood, _) => mood._color,
        domainFn: (Mood mood, _) => mood._emoji,
        measureFn: (Mood mood, _) => mood._numOfDays, //this can't take futures
      );
      setState(() {
        _data = moods;
        _chartData = temp;
      });

    });
  }

  @override
  Widget build(BuildContext context) {
     if(_chartData != null ){
      return Container(
        child: charts.PieChart(
          _chartData,
          animate: true,
        ),
      );
    } else {
      return CircularProgressIndicator();
    }
  }
}
编辑:你也需要了解设置状态


颤振图为样本提供静态数据。但是,您正在动态获取数据,因此需要调用set state

衷心感谢您抽出时间,是的,错误已经消失,但还有一个问题,当我切换到我的应用程序的其他屏幕,然后导航回图表屏幕时,我看到circularprogressIndicator将永远移动,除非我重新热加载应用程序,然后再次显示图表。我意识到我搞乱了我的错误。我忘了写setstate,我应该修改一下代码。我刚刚添加了设置状态,但我应该进一步修改它。不支持使用setState执行大量逻辑。您只需要更改一个变量。我现在做了一个快速而肮脏的更改。我添加了一个小修订。尽量使设置状态透明,尽量不要使功能过大。理想情况下,setState只需分配一个变量。请看一下修订本以理解
    import 'package:flutter/material.dart';
    import 'dart:math';
    import 'package:charts_flutter/flutter.dart' as charts;
    import '../view/mood.dart';
    import '../models/mood_db.dart';
    import 'dart:async';

    class Mood {
      String _emoji;
      int _numOfDays; // this has to int bcz charts can't take future<int>
      charts.Color _color;

      Mood(this._emoji, this._numOfDays, this._color);
    }

    class MoodChart extends StatefulWidget {
      @override
      _MoodChartState createState() => _MoodChartState();
    }

    class _MoodChartState extends State<MoodChart> {
      DatabaseHelper _databaseHelper = DatabaseHelper();
      List<Mood> _data;
      List<charts.Series<Mood, String>> _chartData;

      // Here I used async-await but this function still return Future<int>    
      numOfDaysFn(int id) async {
        int numOfDays =await _databaseHelper.numOfMoodDays(id);
        return numOfDays;
      }

      void initData() async {
        _chartData = List<charts.Series<Mood, String>>();

        _data = <Mood>[
          Mood(
              allMoods[0], numOfDaysFn(1), charts.MaterialPalette.red.shadeDefault),
          Mood(allMoods[1], numOfDaysFn(2),
              charts.MaterialPalette.blue.shadeDefault),
          Mood(allMoods[2], numOfDaysFn(3),
              charts.MaterialPalette.gray.shadeDefault),
          Mood(allMoods[3], numOfDaysFn(4),
              charts.MaterialPalette.indigo.shadeDefault),
          Mood(allMoods[4], numOfDaysFn(5),
              charts.MaterialPalette.green.shadeDefault),
        ];
        _chartData.add(charts.Series(
          id: 'Mood',
          data: _data,
          colorFn: (Mood mood, _) => mood._color,
          domainFn: (Mood mood, _) => mood._emoji,
          measureFn: (Mood mood, _) => **mood._numOfDays**, //this can't take futures
        ));
      }

      @override
      void initState() {
        super.initState();
        initData();
      }

      @override
      Widget build(BuildContext context) {
        return Container(
          child: charts.PieChart(
            _chartData,
            animate: true,
          ),
        );
      }
    }
List allMoods = ['Disgusting', 'Bad', 'Ok', 'Good', 'Amazing'];
import 'package:flutter/material.dart';
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import '../view/mood.dart';
import '../models/mood_db.dart';
import 'dart:async';

class Mood {
  String _emoji;
  int _numOfDays; // this has to int bcz charts can't take future<int>
  charts.Color _color;

  Mood(this._emoji, this._numOfDays, this._color);
}

class MoodChart extends StatefulWidget {
  @override
  _MoodChartState createState() => _MoodChartState();
}

class _MoodChartState extends State<MoodChart> {
  DatabaseHelper _databaseHelper = DatabaseHelper();
  List<Mood> _data;
  List<charts.Series<Mood, String>> _chartData = null;

  // Here I used async-await but this function still return Future<int>    
  Future<List<int>> numOfDaysFn(List<int> days) async {
    return Future.wait(days.map((d) => _databaseHelper.numOfMoodDays(d)));
  }

  void initData( List<int> idx, List<int> days) {
    setState(() {


      _chartData = List<charts.Series<Mood, String>>();

      _data = <Mood>[
        Mood(
            allMoods[idx[0]-1], days[0], charts.MaterialPalette.red.shadeDefault),
        Mood(allMoods[idx[1]-1], days[1],
            charts.MaterialPalette.blue.shadeDefault),
        Mood(allMoods[idx[2]-1], days[2],
            charts.MaterialPalette.gray.shadeDefault),
        Mood(allMoods[idx[3]-1], days[3],
            charts.MaterialPalette.indigo.shadeDefault),
        Mood(allMoods[idx[4]-1], days[4],
            charts.MaterialPalette.green.shadeDefault),
      ];
      _chartData.add(charts.Series(
        id: 'Mood',
        data: _data,
        colorFn: (Mood mood, _) => mood._color,
        domainFn: (Mood mood, _) => mood._emoji,
        measureFn: (Mood mood, _) => mood._numOfDays, //this can't take futures
      ));
    });
  }

  @override
  void initState() {
    super.initState();
    var months = [1,2,3,4,5];
    numOfDaysFn(months).then((days) {
        initData(months, days);
    });
  }

  @override
  Widget build(BuildContext context) {
     if(_chartData != null ){
      return Container(
        child: charts.PieChart(
          _chartData,
          animate: true,
        ),
      );
    } else {
      return CircularProgressIndicator();
    }
  }
}
    import 'package:flutter/material.dart';
import 'dart:math';
import 'package:charts_flutter/flutter.dart' as charts;
import '../view/mood.dart';
import '../models/mood_db.dart';
import 'dart:async';

class Mood {
  String _emoji;
  int _numOfDays; // this has to int bcz charts can't take future<int>
  charts.Color _color;

  Mood(this._emoji, this._numOfDays, this._color);
}

class MoodChart extends StatefulWidget {
  @override
  _MoodChartState createState() => _MoodChartState();
}

class _MoodChartState extends State<MoodChart> {
  DatabaseHelper _databaseHelper = DatabaseHelper();
  List<Mood> _data;
  List<charts.Series<Mood, String>> _chartData = null;

  static List<charts.Color> DEFAULT_SHADE  = [
    null,
    charts.MaterialPalette.red.shadeDefault, 
    charts.MaterialPalette.blue.shadeDefault, 
    charts.MaterialPalette.gray.shadeDefault,
    charts.MaterialPalette.indigo.shadeDefault,
    charts.MaterialPalette.green.shadeDefault];

  Future<Mood> numOfDaysFn(int day) async {
    return Mood(  allMood[day-1] , _databaseHelper.numOfMoodDays(day), DEFAULT_SHADE[day] );
  }
  Future<List<Mood>> returnAllNumOfDaysFn( List<int> days) async {
    return Future.wait(days.map((d) => numOfDaysFn(d)));
  }

  @override
  void initState() {
    super.initState();
    var months = [1,2,3,4,5];
    returnAllNumOfDaysFn(months).then((moods) {
      var temp = charts.Series(
        id: 'Mood',
        data: _data,
        colorFn: (Mood mood, _) => mood._color,
        domainFn: (Mood mood, _) => mood._emoji,
        measureFn: (Mood mood, _) => mood._numOfDays, //this can't take futures
      );
      setState(() {
        _data = moods;
        _chartData = temp;
      });

    });
  }

  @override
  Widget build(BuildContext context) {
     if(_chartData != null ){
      return Container(
        child: charts.PieChart(
          _chartData,
          animate: true,
        ),
      );
    } else {
      return CircularProgressIndicator();
    }
  }
}