Трепетание, проблема отображения информации базы данных - PullRequest
0 голосов
/ 20 апреля 2020

поэтому я пытаюсь создать простое приложение для заметок, которое сохраняет заметки в базе данных с помощью SQFlite. Я добавил кнопку «Добавить заметки» с двумя полями TextField для заголовка и текста и работает, идея состоит в том, чтобы отобразить заголовок и текст в карточке в теле, моя проблема в том, что она создает и отображает карточку только с двумя текстами после перезапуска приложения, а не после нажатия «Сохранить». Вот код на данный момент:

main.dart:

import 'package:flutter/material.dart';

import 'home_screen.dart';
import 'note_inherited_widget.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NoteInheritedWidget(
          MaterialApp(
        home: HomeScreen(),
        theme: ThemeData(
            primaryColor: Colors.deepOrange, accentColor: Colors.deepPurple),
      ),
    );
  }
}

home_screen.dart

import 'package:flutter/material.dart';

import 'package:simple_notes/note_inherited_widget.dart';
import 'package:simple_notes/providers/note_providers.dart';
import './note_inherited_widget.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  final TextEditingController titleController = TextEditingController();
  final TextEditingController textController = TextEditingController();

  @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    titleController.dispose();
    textController.dispose();
    super.dispose();
  }

  DummyDataProvider notes;

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    notes = NoteInheritedWidget.of(context);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Simple Notes'),
          centerTitle: true,
        ),
        body: FutureBuilder(
            future: NoteProvider.getNoteList(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                final notes = snapshot.data;
                return ListView.builder(
                  itemBuilder: (context, index) {
                    return Card(
                      child: Column(
                        children: <Widget>[
                          NoteTitle(notes[index]['title']),
                          NoteText(notes[index]['text'])
                        ],
                      ),
                    );
                  },
                  itemCount: notes.length,
                );
              }
              return Center(child: CircularProgressIndicator());
            }
            ),
        bottomNavigationBar: (FlatButton(
            onPressed: () {
              showMyDialog(context);
            },
            child: Text('Add note'))));
  }

  Future<void> showMyDialog(
    BuildContext context,
  ) {
    return showDialog<void>(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: Column(
              children: <Widget>[
                TextField(
                  controller: titleController,
                ),
                TextField(
                  controller: textController,
                )
              ],
            ),
            actions: <Widget>[
              MaterialButton(onPressed: () {
                final title = titleController.text;
                final text = textController.text;
                NoteProvider.insertNote({
                  'title': title,
                  'text': text
                });
                Navigator.pop(context);
              }, 
              child: Text('save')
              )
            ],
          );
        });
  }
}

class NoteTitle extends StatelessWidget {
  final String title;

  NoteTitle(this.title);

  @override
  Widget build(BuildContext context) {
    return Text(
      title,
      style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold),
    );
  }
}

class NoteText extends StatelessWidget {
  final String text;

  NoteText(this.text);

  @override
  Widget build(BuildContext context) {
    return Text(
      text,
      style: TextStyle(
        color: Colors.grey.shade600,
      ),
      maxLines: 2,
      overflow: TextOverflow.ellipsis,
    );
  }
}

class SaveButton extends StatelessWidget {
  final Function onPressed;

  SaveButton(this.onPressed);

  @override
  Widget build(BuildContext context) {
    return MaterialButton(
      onPressed: () {

        Navigator.pop(context);
      },
      child: Text('Save'),
    );
  }
}

notes_provider.dart

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

class NoteProvider {
  static Database db;

  static Future open() async {
    db = await openDatabase(join(await getDatabasesPath(), 'notes.db'),
    version: 1,
    onCreate: (Database db, int version) async {
      db.execute('''
      CREATE TABLE notes(
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        text TEXT NOT NULL
      );
      ''');
     }
    );
  }

  static Future<List<Map<String, dynamic>>> getNoteList() async {
      if (db == null) {
        await open();
      }
      return await db.query('Notes');
    }

    static Future insertNote (Map<String, dynamic> note) async {
      await db.insert('Notes', note);
    }
}

I Я не смог решить эту проблему, так как сейчас изучаю программирование флаттера. Если бы вы, ребята, могли бы указать мне правильное решение этой проблемы, это было бы ужасно c.

Заранее спасибо!

...