繁体   English   中英

我在 flutter 中创建笔记应用程序并卡在 sqflite 中,如何将我的标题和正文传递给插入方法

[英]I am creating note app in flutter and stuck in sqflite, how can I pass my title and body to insert method

我正在构建一个简单的笔记应用程序,但我坚持使用 SQLite 保存数据(标题和正文)。

数据库助手 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});
  }

这是Notes的Model Class

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
    };
  }
}

这就是我调用插入方法的地方(类名 = 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,
        )
      )
  );
}

它显示太多位置 arguments 预期 1 找到 2。我知道我需要发送 1 个参数,但我如何将标题和正文作为 1 个参数发送。 也许通过 List 我可以发送它,但我不知道该怎么做。 伙计们,这里有任何帮助,过去 5 天我一直坚持这一点。

检查下面我根据您提供的代码创建的示例。

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
    };
  }
}

这只是一个示例演示示例,在一个文件中添加了所有内容并进行了许多更改。 根据您的需要更改它。

您不需要在数据库中提供的自动递增 ID。 运行该应用程序,让我知道它是否有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM