Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Sqlite 如何在Listview中恢复数据_Sqlite_Flutter - Fatal编程技术网

Sqlite 如何在Listview中恢复数据

Sqlite 如何在Listview中恢复数据,sqlite,flutter,Sqlite,Flutter,我的目标是将数据从sql数据库恢复到Listview。首先,我从创建数据库和模型类开始。其次,我意识到我必须使用FutureBuilder。但我不明白,如何在我的情况下使用这些东西。此外,我知道,必须使用GlobalKey 这是我的密码。在此版本的代码中,警报对话框不起作用 导入“包装:颤振/材料.省道”; 进口“包装:颤振/cupertino.dart”; 导入“package:path/path.dart”; 导入“dart:ui”; 导入“包:武士团/program_training_ha

我的目标是将数据从sql数据库恢复到Listview。首先,我从创建数据库和模型类开始。其次,我意识到我必须使用FutureBuilder。但我不明白,如何在我的情况下使用这些东西。此外,我知道,必须使用GlobalKey

这是我的密码。在此版本的代码中,警报对话框不起作用

导入“包装:颤振/材料.省道”;
进口“包装:颤振/cupertino.dart”;
导入“package:path/path.dart”;
导入“dart:ui”;
导入“包:武士团/program_training_handler.dart”;
导入“package:samuraigym/my_icons_icons.dart”作为客户图标;
导入“包:sqflite/sqflite.dart”;
导入“package:path_provider/path_provider.dart”;
导入“dart:async”;
导入“dart:io”作为io;
进口“包装:fluttoast/fluttoast.dart”;
类MeasurementsScreen扩展StatefulWidget{
@凌驾
_MeasurementsScreenState createState()=>_MeasurementsScreenState();
}
类_MeasurementsScreenState扩展状态{
列出清单项目;
最终脚手架键=新的GlobalKey();
final formKey=new GlobalKey();
肌肉的弦型;
肌弦数;
var名称项=[“БСС”,“СС”,“Пччччччч”,“Гчччччччч”,“Бч,
"Предплечье","Запястье","Живот","Бедро","Голень","Лодыжка"];
@凌驾
void initState(){
super.initState();
initListItems();
}
void initListItems(){
列表项=[
新列表项(
详细信息:nameItem[0],
索引:0,
数据:”),
新列表项(
详细信息:名称项目[1],
索引:1,
数据:”),
新列表项(
详细信息:名称项目[2],
索引:2,
数据:”),
新列表项(
详细信息:名称项目[3],
索引:3,
数据:”),
新列表项(
详细信息:名称项目[4],
索引:4,
数据:”),
新列表项(
详细信息:名称项目[5],
索引:5,
数据:”),
新列表项(
详细信息:名称项目[6],
索引:6,
数据:”),
新列表项(
详细信息:名称项目[7],
索引:7,
数据:”),
新列表项(
详细信息:名称项目[8],
索引:8,
数据:”),
新列表项(
详细信息:名称项目[9],
索引:9,
数据:”),
新列表项(
详细信息:名称项目[10],
索引:10,
数据:”),
新列表项(
详细信息:名称项目[11],
索引:11,
数据:“”)
];
}
void sumbitContact(int索引,字符串编号){
if(this.formKey.currentState.validate())
formKey.currentState.save();
其他的
返回null;
var measurementsDatabaseModel=measurementsDatabaseModel();
measurementsDatabaseModel.numberOfMuscle=numberOfMuscle;
measurementsDatabaseModel.typeOfMuscle=作为字符串的索引;
var dbHelper=DatabaseHelperPerformances();
addNewMeasurementsDatabaseModel(measurementsDatabaseModel);
FlatterToast.showToast(消息:“联系人已保存”,
烤面包片长度:烤面包片长度(短);
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
钥匙:脚手架钥匙,
背景颜色:颜色(0xff2b2b2b),
appBar:appBar(
背景颜色:颜色。浅绿色[400],
标题:正文(
'Замеры',
样式:新文本样式(
颜色:颜色。白色
),),
领先:IconButton(
图标:图标(图标。箭头返回),
颜色:颜色,白色,
onPressed:()=>Navigator.of(context.pop(),
),
),
正文:未来建设者(
future:getMeasurementsDatabaseModelFromDB(),
生成器:(上下文,快照){
if(snapshot.data!=null&&snapshot.hasData){
返回ListView.builder(
物理:弹跳CrollPhysics(),
itemCount:listItems.length,
itemBuilder:(BuildContext ctxt,int index)=>listItems[index],
);
}否则{
返回ListView.builder(
物理:弹跳CrollPhysics(),
itemCount:listItems.length,
itemBuilder:(BuildContext ctxt,int index)=>listItems[index],
);
}
}
)
);
}
}
未来的getMeasurementsDatabaseModelFromDB()异步{
var dbHelper=DatabaseHelperPerformances();
Future contacts=dbHelper.getMeasurementsDatabaseModel();
返回联系人;
}
类ListItem扩展StatefulWidget{
字符串细节;
整数指数;
字符串数据;
_测量屏幕状态测量屏幕;
ListItem({Key-Key,this.detail,this.index,this.data}):super(Key:Key);
@凌驾
_ListItem createState()=>\u ListItem(测量屏幕);
}
类_ListItem扩展状态{
bool-isAppear=false;
最终测量屏幕状态测量屏幕;
DatabaseHelperPerformances db=DatabaseHelperPerformances();
_列表项(此.measurements屏幕);
MeasurementsDatabaseModel MeasurementsDatabaseModel=新的MeasurementsDatabaseModel();
肌肉的弦型;
肌弦数;
字符串lastSelectedValue;
var名称=[“БСС”,“СС”,“Сч”,“Пччччч”,“Гчч”,“БчччччС”,
"Предплечье","Запястье","Живот","Бедро","Голень","Лодыжка"];
var指示=[“ааааааааааааааааааааааааа,
"Ваше предплечье","Ваше запястье","Ваш живот","Ваше бедро","Ваша голень","Ваша лодыжка"];
变量前缀=[“СМ:”,“СГ:”,“СМ:”,“СМ:”,“СМ:”,“СМ:”,“СМ:”,“СМ:”,“СМ:”,“СМ:”;
变量prefixAlert=[“СМ”、“БГ”、“СМ”、“СМ”、“СМ”、“СМ”、“СМ”、“СМ”、“СМ”、“СМ”、“СМ”];
文本编辑控制
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:path/path.dart';
import 'dart:ui';
import 'package:samuraigym/program_training_handler.dart';
import 'package:samuraigym/my_icons_icons.dart' as custicon;
import 'package:sqflite/sqflite.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:async';
import 'dart:io' as io;
import 'package:fluttertoast/fluttertoast.dart';
class MeasurementsScreen extends StatefulWidget {
  @override
  _MeasurementsScreenState createState() => _MeasurementsScreenState();
}

class _MeasurementsScreenState extends State<MeasurementsScreen> {
  List<ListItem> listItems;
  final scaffoldKey = new GlobalKey<ScaffoldState>();
  final formKey = new GlobalKey<FormState>();
  String typeOfMuscle;
  String numberOfMuscle;

  var nameItem = ["Рост","Вес","Шея","Плечевой пояс","Грудь","Бицепс",
    "Предплечье","Запястье","Живот","Бедро","Голень","Лодыжка"];
  @override
  void initState() {
    super.initState();
    initListItems();
  }

  void initListItems() {
    listItems = [
      new ListItem(
          detail: nameItem[0],
          index: 0,
          data: " "),
      new ListItem(
          detail: nameItem[1],
          index: 1,
          data: " "),
      new ListItem(
          detail: nameItem[2],
          index: 2,
          data: " "),
      new ListItem(
          detail: nameItem[3],
          index: 3,
          data: " "),
      new ListItem(
          detail: nameItem[4],
          index: 4,
          data: " "),
      new ListItem(
          detail: nameItem[5],
          index: 5,
          data: " "),
      new ListItem(
          detail: nameItem[6],
          index: 6,
          data: " "),
      new ListItem(
          detail: nameItem[7],
          index: 7,
          data: " "),
      new ListItem(
          detail: nameItem[8],
          index: 8,
          data: " "),
      new ListItem(
          detail: nameItem[9],
          index: 9,
          data: " "),
      new ListItem(
          detail: nameItem[10],
          index: 10,
          data: " "),
      new ListItem(
          detail: nameItem[11],
          index: 11,
          data: " ")


    ];
  }
  void sumbitContact(int index, String numberOfMuscle) {
    if(this.formKey.currentState.validate())
      formKey.currentState.save();
    else
      return null;

    var measurementsDatabaseModel = MeasurementsDatabaseModel();
    measurementsDatabaseModel.numberOfMuscle = numberOfMuscle;
    measurementsDatabaseModel.typeOfMuscle = index as String;

    var dbHelper = DatabaseHelperForMeasurements();
    dbHelper.addNewMeasurementsDatabaseModel(measurementsDatabaseModel);
    Fluttertoast.showToast(msg: 'Contact was saved',
        toastLength: Toast.LENGTH_SHORT);

  }
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: scaffoldKey,
      backgroundColor: Color(0xff2b2b2b),
      appBar: AppBar(
        backgroundColor: Colors.lightGreen[400],
        title: Text(
          'Замеры',
          style: new TextStyle(
            color: Colors.white
          ),),
        leading: IconButton(
          icon:Icon(Icons.arrow_back),
          color: Colors.white ,
          onPressed:() => Navigator.of(context).pop(),
        ),
      ),
      body: FutureBuilder<List<MeasurementsDatabaseModel>>(
        future: getMeasurementsDatabaseModelFromDB(),
        builder: (context, snapshot){
        if(snapshot.data != null  && snapshot.hasData){
          return  ListView.builder(
            physics: BouncingScrollPhysics(),
            itemCount: listItems.length,
            itemBuilder: (BuildContext ctxt, int index) => listItems[index],
          );
        } else {
          return ListView.builder(
            physics: BouncingScrollPhysics(),
            itemCount: listItems.length,
            itemBuilder: (BuildContext ctxt, int index) => listItems[index],
          );
        }
        }
      )
    );
  }



}

Future<List<MeasurementsDatabaseModel>> getMeasurementsDatabaseModelFromDB() async {
  var dbHelper = DatabaseHelperForMeasurements();
  Future<List<MeasurementsDatabaseModel>> contacts = dbHelper.getMeasurementsDatabaseModel();
  return contacts;
}

class ListItem extends StatefulWidget {
  String detail;
  int index;
  String data;
  _MeasurementsScreenState measurementsScreen;
  ListItem({Key key, this.detail, this.index, this.data}) : super(key: key);

  @override
  _ListItem createState() => _ListItem(measurementsScreen);
}
class _ListItem extends State<ListItem>  {
  bool isAppear = false;
  final _MeasurementsScreenState measurementsScreen;
  DatabaseHelperForMeasurements db  = DatabaseHelperForMeasurements();
  _ListItem(this.measurementsScreen);
  MeasurementsDatabaseModel measurementsDatabaseModel = new MeasurementsDatabaseModel();
  String typeOfMuscle;
  String numberOfMuscle;

  String lastSelectedValue;
  var name = ["Рост","Вес","Шея","Плечевой пояс","Грудь","Бицепс",
    "Предплечье","Запястье","Живот","Бедро","Голень","Лодыжка"];
  var indication = ["Ваш рост","Ваш вес","Ваша шея","Ваш плечевой пояс","Ваша грудь","Ваш бицепс",
    "Ваше предплечье","Ваше запястье","Ваш живот","Ваше бедро","Ваша голень","Ваша лодыжка"];
  var prefix = ["см: ","кг: ","см: ","см: ","см: ","см: ","см: ","см: ","см: ","см: ","см: ","см: "];
  var prefixAlert = ["см","кг","см","см","см","см","см","см","см","см","см","см"];
  TextEditingController customcintroller;


  Future<String> createAlertDialog(BuildContext context, int indexAl) async{
    customcintroller = TextEditingController();
      String returnVal = await showDialog(
          context: context, builder: (context){
        return AlertDialog(
          title: Text(name[indexAl]),
          content: TextFormField(
            textDirection: TextDirection.ltr,
            controller: customcintroller,
            style: TextStyle(
                color: Colors.lightGreen[400],
                fontSize: 18.5),
            decoration: InputDecoration(
              contentPadding: EdgeInsets.only(bottom: 4.0),
              labelText: indication[indexAl],
              suffixText: prefixAlert[widget.index],
              alignLabelWithHint: false,
            ),
            keyboardType: TextInputType.phone,
            textInputAction: TextInputAction.done,
            onSaved: (val) => this.numberOfMuscle = val,

          ),
          actions: <Widget>[
            FlatButton(
              child: const Text('ОТМЕНА'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
            FlatButton(
              child: const Text('ОК'),
              onPressed: () {
                setState(() {
                  widget.data = customcintroller.text.toString();
                  isAppear = !isAppear;
                  measurementsScreen.sumbitContact(widget.index, widget.data);
                  getMeasurementsDatabaseModelFromDB();
                  Navigator.of(context).pop();
                });
              },
            ),
          ],
        );
      });

      return returnVal;

  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: GestureDetector(
        onTap: () {
          createAlertDialog(context, widget.index);
        },
        child: Container(
          color: Color(0xff2b2b2b),
          height: 55.0,
          margin: const EdgeInsets.symmetric(
            vertical: 1.0,
          ),
          child: new Stack(
            children: <Widget>[
              new Container(
                child: new SizedBox.expand(
                  child: Container(
                    alignment: Alignment.center,
                    child: new Row(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      mainAxisSize: MainAxisSize.max,
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
//                    Padding(
//                      padding: const EdgeInsets.all(8.0),
//                    child: Icon(
//                      custicon.MyIcons.bathroom_scale,
//                      color: Colors.lightGreen[400],
//                      size: 40.0)),
                        Padding(
                          padding: const EdgeInsets.all(16.0),
                          child: new Text(
                            widget.detail,
                            style:
                            new TextStyle(fontSize: 16.0, color: Colors.white),
                          ),
                        ),
                        Container(
                          alignment: Alignment.centerRight,
                          child: isAppear ? Padding(
                              padding: EdgeInsets.all(8.0),
                              child: Container(
                                  decoration: ShapeDecoration(
                                    color: Colors.lightGreen[400],
                                    shape: RoundedRectangleBorder(
                                      side: BorderSide(width: 1.0, style: BorderStyle.solid, color: Colors.white),
                                      borderRadius: BorderRadius.all(Radius.circular(5.0)),
                                    ),
                                  ),
                                  child: Padding(
                                      padding: EdgeInsets.all(4.0),
                                      child: new Text(
                                        prefix[widget.index] + widget.data,
                                        style: new TextStyle(
                                            fontSize: 16.0,
                                            color: Colors.white
                                        ),
                                      )))) : SizedBox(),
                        )
                      ],
                    ),
                  ),
                ),
              ),
            ],
          ),
        )));
  }
}
class MeasurementsDatabaseModel{
  int id;
  String typeOfMuscle;
  String numberOfMuscle;
  MeasurementsDatabaseModel();
}
class DatabaseHelperForMeasurements{
  static Database db_instance;
  final String TABLE_NAME = "Measurements";

  Future<Database> get db async{
    if(db_instance == null)
      db_instance = await initDB();
    return db_instance;
  }
  initDB() async {
    io.Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path,"Measurements_db.db");
    var db = await openDatabase(path,version: 1, onCreate: onCreateFunc);
    return db;
  }

  void onCreateFunc(Database db, int version) async{

    await db.execute('CREATE TABLE $TABLE_NAME(id INTEGER PRIMARY KEY AUTOINCREMENT, typeOfMuscle TEXT, numberOfMuscle TEXT);');

  }

  Future<List<MeasurementsDatabaseModel>> getMeasurementsDatabaseModel() async{
    var db_connection = await db;
    List<Map> list = await db_connection.rawQuery('SELECT * FROM $TABLE_NAME');
    List<MeasurementsDatabaseModel> modelList = new List();
    for(int i = 0; i < list.length; i++){
      MeasurementsDatabaseModel measurementsDatabaseModel = new MeasurementsDatabaseModel();
      measurementsDatabaseModel.id = list[i]['id'];
      measurementsDatabaseModel.typeOfMuscle = list[i]['typeOfMuscle'];
      measurementsDatabaseModel.numberOfMuscle = list[i]['numberOfMuscle'];

      modelList.add(measurementsDatabaseModel);
    }
    return modelList;
  }

  void addNewMeasurementsDatabaseModel(MeasurementsDatabaseModel measurementsDatabaseModel) async {
    var db_connection = await db;
    String query =
        'INSERT INTO $TABLE_NAME(name,phone) VALUES( \'${measurementsDatabaseModel.typeOfMuscle}\',\'${measurementsDatabaseModel.numberOfMuscle}\')';
    await db_connection.transaction((transition) async{
      return await transition.rawInsert(query);
    });
  }
  void updateMeasurementsDatabaseModel(MeasurementsDatabaseModel measurementsDatabaseModel) async {
    var db_connection = await db;
    String query =
        'UPDATE $TABLE_NAME SET name =\'${measurementsDatabaseModel.typeOfMuscle}\',phone =\'${measurementsDatabaseModel.typeOfMuscle}\' WHERE id =${measurementsDatabaseModel.id}';
    await db_connection.transaction((transition) async{
      return await transition.rawQuery(query);
    });
  }
  void deleteMeasurementsDatabaseModel(MeasurementsDatabaseModel measurementsDatabaseModel) async {
    var db_connection = await db;
    String query = 'DELETE FROM $TABLE_NAME WHERE id = ${measurementsDatabaseModel.id}';
    await db_connection.transaction((transition) async{
      return await transition.rawQuery(query);
    });
  }
}