Flutter如何将数据从sqflite填充到下拉列表

时间:2019-11-12 05:18:17

标签: flutter sqflite

我已经在stackoverflow中看到了与我的问题非常相似的问题,但是这些问题和解答对我来说很有用。所以这是我的问题,如何将数据从sqflite填充到下拉列表。以下是我编写的Dart文件。请帮助我解决问题

dbhelper.dart

import 'package:abc/model/manage_categories.dart';
import 'package:sqflite/sqflite.dart';
import 'dart:async';
import 'dart:io';
import 'package:path_provider/path_provider.dart';

class DatabaseHelper {

  static DatabaseHelper _databaseHelper;    // Singleton DatabaseHelper
  static Database _database;                // Singleton Database

  String categoriesTable = 'categories_table';
  String colId = 'id';
  String colTitle = 'title';
  String colDate = 'date';

  DatabaseHelper._createInstance(); // Named constructor to create instance of DatabaseHelper

  factory DatabaseHelper() {

    if (_databaseHelper == null) {
      _databaseHelper = DatabaseHelper._createInstance(); // This is executed only once, singleton object
    }
    return _databaseHelper;
  }

  Future<Database> get database async {

    if (_database == null) {
      _database = await initializeDatabase();
    }
    return _database;
  }

  Future<Database> initializeDatabase() async {
    // Get the directory path for both Android and iOS to categories database.
    Directory directory = await getApplicationDocumentsDirectory();
    String path = directory.path + 'categoriess.db';

    // Open/create the database at a given path
    var categoriessDatabase = await openDatabase(path, version: 1, onCreate: _createDb);
    return categoriessDatabase;
  }

  void _createDb(Database db, int newVersion) async {

    await db.execute('CREATE TABLE $categoriesTable($colId INTEGER PRIMARY KEY AUTOINCREMENT, $colTitle TEXT, '
        '$colDate TEXT)');
  }

  // Fetch Operation: Get all categories objects from database
  Future<List<Map<String, dynamic>>> getCategoriesMapList() async {
    Database db = await this.database;

//      var result = await db.rawQuery('SELECT * FROM $categoriesTable order by $colTitle ASC');
    var result = await db.query(categoriesTable, orderBy: '$colTitle ASC');
    return result;
  }

  // Insert Operation: Insert a categories object to database
  Future<int> insertCategories(Categories categories) async {
    Database db = await this.database;
    var result = await db.insert(categoriesTable, categories.toMap());
    return result;
  }

  // Update Operation: Update a categories object and save it to database
  Future<int> updateCategories(Categories categories) async {
    var db = await this.database;
    var result = await db.update(categoriesTable, categories.toMap(), where: '$colId = ?', whereArgs: [categories.id]);
    return result;
  }

  Future<int> updateCategoriesCompleted(Categories categories) async {
    var db = await this.database;
    var result = await db.update(categoriesTable, categories.toMap(), where: '$colId = ?', whereArgs: [categories.id]);
    return result;
  }

  // Delete Operation: Delete a categories object from database
  Future<int> deleteCategories(int id) async {
    var db = await this.database;
    int result = await db.rawDelete('DELETE FROM $categoriesTable WHERE $colId = $id');
    return result;
  }

  // Get number of categories objects in database
  Future<int> getCount() async {
    Database db = await this.database;
    List<Map<String, dynamic>> x = await db.rawQuery('SELECT COUNT (*) from $categoriesTable');
    int result = Sqflite.firstIntValue(x);
    return result;
  }

  // Get the 'Map List' [ List<Map> ] and convert it to 'categories List' [ List<Categories> ]
  Future<List<Categories>> getCategoriesList() async {

    var categoriesMapList = await getCategoriesMapList(); // Get 'Map List' from database
    int count = categoriesMapList.length;         // Count the number of map entries in db table

    List<Categories> categoriesList = List<Categories>();
    // For loop to create a 'categories List' from a 'Map List'
    for (int i = 0; i < count; i++) {
      categoriesList.add(Categories.fromMapObject(categoriesMapList[i]));
    }
    return categoriesList;
  }
}

Add_store_item.dart


import 'package:flutter/material.dart';
import 'package:abc/database/dbhelper_categories.dart';
import 'package:abc/database/dbhelper_manage_inventory.dart';
import 'package:abc/model/Manageinventory_class.dart';
import 'package:abc/model/manage_categories.dart';

class AddStoreItem extends StatefulWidget {

  final Inventory inventory;

  AddStoreItem(this.inventory);

  @override
  State<StatefulWidget> createState() => new AddStoreItemState();
  }


class AddStoreItemState extends State<AddStoreItem> {

  DatabaseHelper databaseHelper = DatabaseHelper();
  List<Categories> categoriesList = <Categories>[];
  int count = 0;

  DBProvider _db = DBProvider();

  TextEditingController _itemController;
  TextEditingController _quantityController;
  TextEditingController _categoryController;
  TextEditingController _unitController;
  TextEditingController _locationController;

  @override
  void initState() {
    super.initState();
    _loadCategorieslist();
    _itemController = new TextEditingController(text: widget.inventory.item);
    _quantityController = new TextEditingController(text: widget.inventory.quantity);
    _categoryController = new TextEditingController(text: widget.inventory.category);
    _unitController = new TextEditingController(text: widget.inventory.unit);
    _locationController = new TextEditingController(text: widget.inventory.location);
  }

  _loadCategorieslist()async{

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          title: Text('Add Inventory')
      ),
      body: SingleChildScrollView(
        child: Container(
          margin: EdgeInsets.all(15.0),
          alignment: Alignment.center,
          child: Column(
            children: <Widget>[
              SizedBox(height: 10),
              TextField(
                controller: _itemController,
                decoration: InputDecoration(labelText: 'Item'),
              ),
              SizedBox(height: 10),
              TextField(
                controller: _quantityController,
                decoration: InputDecoration(labelText: 'Quantity'),
              ),
              SizedBox(height: 10),
              DropdownButton<String>(
                value: categoriesList,
                items: categoriesList.map((String){
                  return DropdownMenuItem<String>(
                    value: value,
                    child: Text(value),
                  );
                }),
                isExpanded: true,
                onChanged: (value) {
                  print("value: $value");
                },
                hint: Text(
                  "Units",
                  style: TextStyle(
//                    color: Colors.black,
                  ),
                ),
              ),
              DropdownButton<String>(
                items: [
                  DropdownMenuItem<String>(
                    value: "1",
                    child: Text(
                      "First",
                    ),
                  ),
                  DropdownMenuItem<String>(
                    value: "2",
                    child: Text(
                      "Second",
                    ),
                  ),
                ],
                isExpanded: true,
                onChanged: (value) {
                  print("value: $value");
                },
                hint: Text(
                  "Location",
                  style: TextStyle(
//                    color: Colors.black,
                  ),
                ),
              ),
              SizedBox(height: 10),
              RaisedButton(
                child: (widget.inventory.id != null) ? Text('Update') : Text('Add Inventory'),
                onPressed: () {
                  _addInventory();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

  void _addInventory() {
    if (widget.inventory.id != null) {
      _db
          .updateNote(Inventory.withId(
        widget.inventory.id,
        _itemController.text,
        _quantityController.text,
        _categoryController.text,
        _unitController.text,
        _locationController.text,
      ))
          .then((_) => Navigator.pop(context, 'update'));
    } else {
      _db
          .saveNote(Inventory(
          _itemController.text,
          _quantityController.text,
          _categoryController.text,
          _unitController.text,
          _locationController.text,
      ))
          .then((_) => Navigator.pop(context, 'save'));
    }
  }
}

3 个答案:

答案 0 :(得分:0)

AddStoreItemState中,将您的_loadCategorieslist()async方法更改为:

Future<List<Categories>> _loadCategorieslist() async => databaseHelper.getCategoriesMapList();

并用FutureBuilder包裹您的DropdownButton

答案 1 :(得分:0)

这是我从SqfLite读取数据以在下拉列表或数据表(在本例中为条形码记录)中使用它的方式。

这里是模型,其中包括如下的fromJson()函数:

class Barcode {
  String code;
  String itemNo;

  Barcode({
    this.code,
    this.itemNo,
  });

  Map<String, dynamic> toMap() => {
    'code': code,
    'itemNo': itemNo,
  };

  factory Barcode.fromJson(Map<String, dynamic> parsedJson) {
    return Barcode(
      code: parsedJson['code'],
      itemNo: parsedJson['itemNo'],
    );
  }
}

这是我从SqfLite读取条形码(全部)的方式:

static Future<List<Barcode>> getAll() async {
  final db = await DbUtil.database;
  var response = await db.query(tableName);
  List<Barcode> list = response.map((c) => Barcode.fromJson(c)).toList();

  return list;
}

这里仅读​​取一个条形码:

static Future<Barcode> get(String barcode) async {
  final db = await DbUtil.database;
  var response = await db.query(tableName, where: "$pkName = ?", whereArgs: ['$barcode']);
  return response.isNotEmpty ? Barcode.fromJson(response.first) : null;
}

然后称呼它:

var barcode = await BarcodeDb.get(scanText);

尝试一下,它应该对您有用。

答案 2 :(得分:0)

这是我如何从sqflite填充数据列表以进行下拉

从sqflite声明到AddStoreItemState的列表如下

DatabaseHelper databaseHelper = DatabaseHelper();
  List<Categories> categoriesList ;
  Categories _category;

现在按如下所示包装下拉按钮

 Center(
              child: DropdownButtonFormField<Categories>(
                hint: Text('Categories'),
                value: _category,
                onChanged: (Categories value){
                  setState(() {
                    _category = value;
                  });
                },
                items: categoriesList.map((user) => DropdownMenuItem<Categories>(
                  child: Text(user.cname),
                  value: user,
                )
                ).toList(),

              ),
            ),