samedi 29 mai 2021

How to save value in a column for multiple records in table for selected checkboxes in flutter

I have a listview which displays notes from note table in database. this notes have checkboxes. When i click on checkboxes i.e various notes I want to update value as "completed" in 'sts' column of note when i click save button for all those notes. Each note has a note_id. How do I do that?

note_info.dart

import 'dart:io';
import 'package:vers2cts/models/note_model.dart';
import 'package:vers2cts/models/customer_model.dart';
import 'package:vers2cts/services/db_service.dart';
import 'package:vers2cts/utils/db_helper.dart';
import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';
import 'package:vers2cts/utils/form_helper.dart';

import 'new_note.dart';


class Note_Info extends StatefulWidget{
  final String appBarTitle;
  final CustomerModel customer;
  
  Note_Info(this. customer, this.appBarTitle);

  @override
  State<StatefulWidget> createState() {
    //return Note_InfoState();
   return Note_InfoState(this. customer,this.appBarTitle);
  }

}

class Note_InfoState extends State<Note_Info> {
  DBService dbService = DBService();
  List<NoteModel> noteList;
  int count = 0;

  static final GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
  NoteModel note=NoteModel();
  String appBarTitle;
  CustomerModel customer=new CustomerModel();
  Note_InfoState(this.customer, this.appBarTitle);


  bool rememberMe = false;
  DateTime _date = DateTime.now();
  TextEditingController custfNameController = TextEditingController();

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


  @override
  Widget build(BuildContext context) {
  updateListView();
    if (noteList == null) {
      noteList = List<NoteModel>();
      updateListView();
    }

    TextStyle titleStyle = Theme.of(context).textTheme.subhead;
    var height = MediaQuery.of(context).size.height;
    var name=customer.first_name+" "+customer.last_name;
    custfNameController.text = name;

    return DefaultTabController(
        length: 4,
        child: Scaffold(
            appBar: AppBar(
              actions: [
                IconButton(
                  icon: Icon(
                    Icons.add,

                  ),
                  onPressed: () {
                    Navigator.of(context).push(MaterialPageRoute(
                        builder: (BuildContext context) => NewNote(customer,note)));
                  },
                )
              ],
            ),
            body: Container(
              child: Column(
                  children: <Widget>[
                    TextField(controller: custfNameController,
                        style: TextStyle(
                            fontSize: 20.0, fontWeight: FontWeight.bold),

                        textAlign: TextAlign.center),
                    Padding(
                      padding: const EdgeInsets.all(15.0),
                      child: Row(children: [
                        ImageProfile(customer.cust_photo),
                        Padding(
                          padding: const EdgeInsets.only(left: 30.0),
                          child: IconButton(
                            icon: Icon(
                              Icons.call,
                              color: Colors.green,
                              size: 45,
                            ),
                            onPressed: () {

                            },
                          ),
                        ),

                      ],),
                    ),

                    SizedBox(
                      height: 50,
                      child: AppBar(
                        bottom: TabBar(
                          tabs: [
                            Tab(
                              text: "All",
                            ),
                            Tab(
                              text: "Pending",
                            ),
                            Tab(
                              text: "Cancelled",
                            ),
                            Tab(
                              text: "Completed",
                            ),
                          ],
                        ),
                      ),
                    ),

                    // create widgets for each tab bar here
                    Expanded(
                      child: TabBarView(
                        children: [
                          // first tab bar view widget
                          Container(
                              child: getNotecheckList()
                          ),

                          // second tab bar view widget
                          Container(

                          ),


                          Container(
                            child: Center(
                              child: Text(
                                'Cancelled',
                              ),
                            ),
                          ),
                          Container(

                            child: Center(
                              child: Text(
                                'Completed',
                              ),
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Container(
                        height: 55.0,
                        width: 200,
                        child: RaisedButton(
                          elevation: 2,

                          shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(20)),
                          color: Theme
                              .of(context)
                              .primaryColorDark,
                          textColor: Colors.white,
                          child: Text('Save', textScaleFactor: 1.5,),
                          onPressed: () {
                            setState(() {
                            _save();
                            });
                          },
                        ),
                      ),
                    ),
                  ]
              ),
            )
        ));
  }

  Widget ImageProfile(String fileName) {
    return Center(
      child: CircleAvatar(
          radius: 80.0,
          backgroundImage:  fileName == null
              ?AssetImage('images/person_icon.jpg')
              :FileImage(File(customer.cust_photo))),
    );
  }
  Future<void> updateListView() {
    final Future<Database> dbFuture = DB.init();
    dbFuture.then((database) {
      int cid=customer.cust_id;

      Future<List<NoteModel>> noteListFuture = dbService.getCustomerNotes(cid);
      noteListFuture.then((noteList) {

        setState(() {
          this.noteList = noteList;
          this.count = noteList.length;
        });
      });
    });
  }

  int _isChecked=-1;
  var selectedIndices = [];
  ListView getNotecheckList() {

    return ListView.builder(
        itemCount: count,
        itemBuilder: (BuildContext context, int position) {



        return Card(
          color: Colors.white,
          elevation: 2.0,
          child: CheckboxListTile(
            title: Text(this.noteList[position].note),
            subtitle: Text(this.noteList[position].actn_on),
            value: selectedIndices.contains(position),
            onChanged: (_) {
              if (selectedIndices.contains(position)) {
                selectedIndices.remove(position);// unselect
              } else {
                selectedIndices.add(position);  // select
              }
            },
            controlAffinity: ListTileControlAffinity.leading,
                ),
            );
          },
         );
        }

  void _save() async {
    int result;
    result = await dbService.updateNote(note);

    if (result != 0) {  // Success
      FormHelper.showAlertDialog(context,'Status', 'Note Saved Successfully');
    } else {  // Failure
      FormHelper.showAlertDialog(context,'Status', 'Problem Saving Note');
    }
  }
  }

note_model.dart

import 'model.dart';

class NoteModel extends Model {
  static String table = 'note';
  bool isSelected=false;
  int note_id;
  int cust_id;
  String note;
  String actn_on;
  int rmnd_ind;
  double prty;
  String colr;
  String sts;

  int id;
  String cre_date;
  String cre_by;
  String mod_date;
  String mod_by;
  int txn_id;
  int delete_ind;

  NoteModel({
    this.note_id,
    this.cust_id,
    this.note,
    this.actn_on,
    this.rmnd_ind,
    this.prty,
    this.colr,
    this.sts,

    this.id,
    this.cre_date,
    this.cre_by,
    this.mod_date,
    this.mod_by,
    this.txn_id,
    this.delete_ind
  });

  static NoteModel fromMap(Map<String, dynamic> map) {
    return NoteModel(
      note_id: map["note_id"],
      cust_id: map['cust_id'],
      note: map['note'].toString(),
      actn_on: map['actn_on'].toString(),
      rmnd_ind: map['rmnd_ind'],
      prty: map['prty'],
      colr: map['colr'].toString(),
      sts: map['sts'].toString(),


      id: map['id'],
      cre_date: map['cre_date'].toString(),
      cre_by: map['cre_by'].toString(),
      mod_date: map['mod_date'].toString(),
      mod_by: map['mod_by'].toString(),
      txn_id: map['txn_id'],
      delete_ind: map['delete_ind'],
    );
  }

  Map<String, dynamic> toMap() {
    Map<String, dynamic> map = {
      'note_id': note_id,
      'cust_id': cust_id,
      'note':note,
      'actn_on': actn_on,
      'rmnd_ind': rmnd_ind,
      'prty': prty,
      'colr': colr,
      'sts':sts,


      'id': id,
      'cre_date': cre_date,
      'cre_by': cre_by,
      'mod_date':mod_date,
      'mod_by':mod_by,
      'txn_id':txn_id,
      'delete_ind': delete_ind

    };

    if (note_id != null) {
      map['note_id'] = note_id;
    }
    return map;
  }
}

db_helper.dart

import 'dart:async';
import 'package:vers2cts/models/model.dart';
import 'package:path/path.dart' as p;
import 'package:sqflite/sqflite.dart';

abstract class DB {
  static Database _db;

  static int get _version => 1;

  static Future<Database> init() async {
    if (_db != null) {
      return _db;
    }

    try {
      var databasesPath = await getDatabasesPath();
      String _path = p.join(databasesPath, 'CTS.db');
      _db = await openDatabase(_path, version: _version, onCreate: onCreate);
      print('db location:'+_path);

    } catch (ex) {
      print(ex);
    }
  }

  static void onCreate(Database db, int version) async {
    await db.execute(
        'CREATE TABLE note (note_id INTEGER PRIMARY KEY,cust_id INTEGER, '
            'note TEXT, '
            'actn_on TEXT, rmnd_ind INTEGER, prty REAL, colr TEXT,'
            'sts TEXT,'
            'id INTEGER, cre_date TEXT,cre_by TEXT, mod_date TEXT,mod_by TEXT, txn_id INTEGER, delete_ind INTEGER)');}
static Future<List<Map<String, dynamic>>> query(String table) async =>
      _db.query(table);

  static Future<int> insert(String table, Model model) async =>
      await _db.insert(table, model.toMap());

  static Future<int> update(String table, Model model) async => await _db
      .update(table, model.toMap(), where: 'id = ?', whereArgs: [model.id]);
  static Future<int> updateNote(String table, Model model) async => await _db
      .update(table, model.toMap(), where: 'note_id = ?', whereArgs: [model.note_id]);
static Future<List<Map<String, dynamic>>> rawQuery(String table) async =>
      _db.query(table);
}

db_service.dart

import 'package:vers2cts/models/note_model.dart';
import 'package:vers2cts/utils/db_helper.dart';

class DBService {
Future<int> insertNote(NoteModel note) async {
    await DB.init();
    var result = await DB.insert(NoteModel.table, note);
    return result;
  }
Future<int> updateNote(NoteModel note) async {
    await DB.init();
    var result = await DB.update(NoteModel.table, note);
    return result;
  }
Future<List<NoteModel>> getCustomerNotes(int customer) async {
    await DB.init();
    var res = await DB.rawQuery("note WHERE cust_id = '$customer' ORDER BY actn_on ASC,prty DESC;");
    int count = res.length;
    List<NoteModel> notelist = List<NoteModel>();
    // For loop to create a 'Note List' from a 'Map List'
    for (int i = 0; i < count; i++) {
      notelist.add(NoteModel.fromMap(res[i]));
    }
    return notelist;
  }
}



Aucun commentaire:

Enregistrer un commentaire