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