Home > Back-end >  I am creating note app in flutter and stuck in sqflite, how can I pass my title and body to insert m
I am creating note app in flutter and stuck in sqflite, how can I pass my title and body to insert m

Time:09-17

I am building a simple note app, but I am stuck at saving the data (title and body) using SQLite.

DataBaseHelper class

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';
import 'model_notes.dart';

class DatabaseHelper {
  static final _databaseName = "myNote.db";
  static final _databaseVersion = 1;
  static final table = 'notes_table';
  static final columnId = 'id';
  static final columnTitle = 'title';
  static final columnBody = 'body';

  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  static Database _database;
  Future<Database> get database async {
    if (_database != null) return _database;
    _database = await _initDatabase();
    return _database;
  }

  _initDatabase() async {
    String path = join(await getDatabasesPath(), _databaseName);
    return await openDatabase(path,
        version: _databaseVersion,
        onCreate: _onCreate);
  }

  Future _onCreate(Database db, int version) async {
    await db.execute('''
          CREATE TABLE $table (
            $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
            $columnTitle TEXT NOT NULL,
            $columnBody TEXT NOT NULL
          )
          ''');
  }

  Future<int> insert(Note note) async {
    Database db = await instance.database;
    return await db.insert(table, {'title': note.title, 'body': note.body});
  }

This is the Model Class for Notes

import 'db_operations.dart';

class Note {
   int id;
   String title;
   String body;

  Note(this.id, this.title, this.body);

  Note.fromMap(Map<String, dynamic> map) {
    id = map['id'];
    title = map['title'];
    body = map['body'];
  }

  Map<String, dynamic> toMap(){
    return {
      DatabaseHelper.columnId : id,
      DatabaseHelper.columnTitle : title,
      DatabaseHelper.columnBody : body
    };
  }
}

and this is where I'm calling insert method (class name = adding_notes.dart)

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:note_taking_app/constants/buttons_and_icons_misc(classes).dart';
import 'package:note_taking_app/db/db_operations.dart';
import 'package:note_taking_app/db/model_notes.dart';
import 'package:sqflite/sqflite.dart';

import 'main_screen.dart';

final bodyController = TextEditingController();
final headerController = TextEditingController();
final dbHelper = DatabaseHelper.instance;

class AddingNotes extends StatefulWidget {
  @override
  _AddingNotesState createState() => _AddingNotesState();
}

class _AddingNotesState extends State<AddingNotes> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        backwardsCompatibility: true,
        leading: LeadingIcon(
          callBack: () {
            Navigator.pop(context);
          },
        ),
        backgroundColor: Colors.white.withOpacity(0.4),
        actions: <Widget>[
          ActionsIconButton(
            icon: Icon(undo, color: black),
            callBack: () {
              debugPrint('undo tapped');
            },
          ),
          ActionsIconButton(
            icon: Icon(redo, color: black),
            callBack: () {
              debugPrint('redo tapped');
            },
          ),
          ActionsIconButton(
            icon: Icon(save, color: black),
            callBack: () async {
              debugPrint(bodyController.text);
              debugPrint(headerController.text);
              getHeaderDataToMainScreen(context);
              String title = headerController.text;
              String body =  bodyController.text;
       /*This is where I am calling insert method*/
              dbHelper.insert(title, body);
            },
          )
        ],
      ),
      body: Container(
        color: Colors.white.withOpacity(0.4),
        child: Padding(
          padding: const EdgeInsets.all(13.0),
          child: Column(
            children: [
              HeaderBody(
                textEditingController: headerController,
              ),
              SizedBox(
                height: 32.0,
              ),
              Expanded(
                child: NotesBody(
                  textEditingController: bodyController,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

getHeaderDataToMainScreen(BuildContext context){
  Navigator.push(context,
      MaterialPageRoute(
        builder: (context) => MainScreen(
          heading : headerController.text,
        )
      )
  );
}

It is showing too many positional arguments expected 1 found 2. I know I need to send 1 argument, but how can I send both title and body as 1 argument. Maybe through List I can send it but I don't know how to do that. Any help here guys, I'm stuck at this for the past 5 days.

CodePudding user response:

Check the example below that i have created based on the code you provided.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

import 'db_operations.dart';

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    home: AddingNotes(),
  ));
}

final bodyController = TextEditingController();
final headerController = TextEditingController();
final dbHelper = DatabaseHelper.instance;

class AddingNotes extends StatefulWidget {
  @override
  _AddingNotesState createState() => _AddingNotesState();
}

class _AddingNotesState extends State<AddingNotes> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        leading: GestureDetector(
          onTap: () {
            Navigator.pop(context);
          },
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Icon(
              Icons.add,
              color: Colors.black,
            ),
          ),
        ),
        backgroundColor: Colors.white.withOpacity(0.4),
        actions: <Widget>[
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: GestureDetector(
              onTap: () {
                debugPrint('undo tapped');
              },
              child: Icon(
                Icons.undo,
                color: Colors.black,
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: GestureDetector(
              onTap: () {
                debugPrint('redo tapped');
              },
              child: Icon(
                Icons.redo,
                color: Colors.black,
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: GestureDetector(
              onTap: () async {
                debugPrint(bodyController.text);
                debugPrint(headerController.text);
                //getHeaderDataToMainScreen(context);
                String title = headerController.text;
                String body = bodyController.text;
                Note note = Note(20, title, body);

                var value = await dbHelper.insert(note);
                print("if 1 is return then insert success and 0 then not inserted : $value");
              },
              child: Icon(
                Icons.save,
                color: Colors.black,
              ),
            ),
          )
        ],
      ),
      body: Container(
        color: Colors.white.withOpacity(0.4),
        child: Padding(
          padding: const EdgeInsets.all(13.0),
          child: Column(
            children: [
              TextField(
                controller: headerController,
              ),
              SizedBox(
                height: 32.0,
              ),
              Expanded(
                child: TextField(
                  controller: bodyController,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// getHeaderDataToMainScreen(BuildContext context) {
//   Navigator.push(context,
//       MaterialPageRoute(
//           builder: (context) =>
//               MainScreen(
//                 heading: headerController.text,
//               )
//       )
//   );
// }

class Note {
  int id;
  String title;
  String body;

  Note(this.id, this.title, this.body);

  Note.fromMap(Map<String, dynamic> map) {
    id = map['id'];
    title = map['title'];
    body = map['body'];
  }

  Map<String, dynamic> toMap() {
    return {
      DatabaseHelper.columnId: id,
      DatabaseHelper.columnTitle: title,
      DatabaseHelper.columnBody: body
    };
  }
}

This is just a sample demo example added every thing in one file and made many changes. change it as per your needs. you don't need a auto increament id as you have given it in the db. Run the app and let me know if it works.

  • Related