必须向文本小部件提供非空字符串。我知道这个问题有很多答案,但它对我不起作用

发布于 2025-01-16 01:42:35 字数 6961 浏览 1 评论 0原文

我是颤振新手,我知道这个问题有很多答案,但它对我不起作用,请帮助我。这些是我的代码

这是我的数据模型

class SubjectModel {
  int? id;
  final String sub;


  SubjectModel({required this.sub, this.id}): assert(sub != null);

  static SubjectModel fromMap(Map<String, Object?>map)
  {
    final id = map['id'] as int;
    final sub = map['name'] as String;

    return SubjectModel(id: id,sub: sub);
  }
}

这是数据库助手

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:schoolmanagement/subject/datamodel3.dart';
import 'package:sqflite/sqflite.dart';
// import 'datamodel2.dart';

ValueNotifier<List<SubjectModel>> subjectlistNotifier = ValueNotifier([]);

late Database _db;

Future<void> initializeDataBasess()async{
  _db = await openDatabase('subject.db',
      version: 1,
      onCreate: (Database db, int version) async{
        await db.execute(
            'CREATE TABLE subject(id INTEGER PRIMARY KEY, sub TEXT) ');
      });
}

Future<void> addSubject(SubjectModel valuess) async{
  await _db.rawQuery(
      'INSERT INTO subject(sub) VALUES(?)',[valuess.sub]);
  getAllSubject();
}

Future<void> getAllSubject() async{
  final _valuess = await _db.rawQuery('SELECT * FROM subject');
  print(_valuess);
  subjectlistNotifier.value.clear();
  _valuess.forEach((map){
    final subj = SubjectModel.fromMap(map);
    subjectlistNotifier.value.add(subj);
    subjectlistNotifier.notifyListeners();
  });
}

Future<void> deleteSubject(int id) async{
  await _db.rawDelete('DELETE FROM subject WHERE id = ?', [id]);
  getAllSubject();
}

单击按钮时添加数据

import 'package:flutter/material.dart';
import 'datamodel3.dart';
import 'function3.dart';

class AddSubjectWidget extends StatelessWidget {
  AddSubjectWidget({Key? key}) : super(key: key);

  final _subController = TextEditingController();


  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(20),
      child: Column(
        children: [
          TextFormField(
            controller: _subController,
            decoration: InputDecoration(
                border: OutlineInputBorder(),
                hintText: 'Name'
            ),
          ),
          SizedBox(height: 20,),
          // Row(
          //   children: [
          ElevatedButton.icon(
            onPressed: () {
              onAddSubjectButtonClicked();
            },
            icon: Icon(Icons.add),
            label: Text('Add Subject'),
          ),
          SizedBox(width: 20,),
        ],
      ),
    );
  }

  Future<void> onAddSubjectButtonClicked() async {
    final _sub = _subController.text.trim();
    if (_sub.isEmpty) {
      return;
    }
    final _subject = SubjectModel(sub: _sub);
    addSubject(_subject);
  }
}

这是列出数据库中的数据

import 'package:flutter/material.dart';
import 'datamodel3.dart';
import 'function3.dart';

class ListSubjectWidget extends StatefulWidget {
  const ListSubjectWidget({Key? key}) : super(key: key);

  @override
  State<ListSubjectWidget> createState() => _ListSubjectWidgetState();
}
class _ListSubjectWidgetState extends State<ListSubjectWidget> {

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: subjectlistNotifier,
      builder: (BuildContext ctxs,
          List<SubjectModel> subjectList,
          Widget? child){
        return ListView.separated(
          itemBuilder: (ctxs, indexs) {
            final datass = subjectList[indexs];
            return ListTile(
              title: Text(datass.sub),
              isThreeLine: true,
              trailing: IconButton(onPressed: (){
                if (datass.id != null){
                  deleteSubject(datass.id!);
                }else{
                  print("Subject is null, unable to delete");
                }
              },
                icon: Icon(Icons.delete,color: Colors.red,),),
            );
          },
          separatorBuilder: (ctxs, indexs){
            return Divider();
          },
          itemCount: subjectList.length,
        );
      },
    );
  }
}

这是主屏幕

import 'package:dropdownfield2/dropdownfield2.dart';
import 'package:flutter/material.dart';
import 'datamodel3.dart';
import 'function3.dart';
import 'list3.dart';

class Subscreen extends StatefulWidget {
  const Subscreen({Key? key}) : super(key: key);

  @override
  State<Subscreen> createState() => _SubscreenState();
}

class _SubscreenState extends State<Subscreen> {
  final subjectselected = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Select Subject"),
        centerTitle: true,
      ),
      body: Container(
        // height: MediaQuery.of(context).size.height,
        // width: MediaQuery.of(context).size.width,
        padding: EdgeInsets.all(20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            SizedBox(height: 20,),
            DropDownField(
              controller: subjectselected,
              hintText: "Select Subject",
              enabled: true,
              items: subject,
              itemsVisibleInDropdown: 5,
              onValueChanged: (value){
                setState(() {
                  selectsubject = value;
                });
              },
            ),
            SizedBox(height: 30,),
                  Text(
                selectsubject,
              style: TextStyle(
                fontSize: 20
              ),
              textAlign: TextAlign.center,),
            TextFormField(
              controller: subjectselected,
            ),
            ElevatedButton.icon(
              onPressed: () {
                // onAddSubjectButtonClicked();
              },
              icon: Icon(Icons.add),
              label: Text('Add Subject'),
            ),
            // Expanded(child: ListSubjectWidget()),
            Container(
                height:100,
                width: 100,
                child: ListSubjectWidget()),
                  // ListSubjectWidget()
                  // Expanded(child: ListSubjectWidget()),
            ]
        ),
      ),
    );
  }
}


String selectsubject = "";
final subjectselected = TextEditingController();

  List<String> subject = [
    "Maths",
    "Physics",
    "Chemistry",
    "Biology",
    "Electronics",
    "English",
    "Hindi",
    "Social",
    "PT",
    "Computer",
  ];

Future<void> onAddSubjectButtonClicked() async {
  final _sub = subjectselected.text.trim();
  if (_sub.isEmpty) {
    return;
  }
  final _subject = SubjectModel(sub: _sub);
  addSubject(_subject);
}

请帮助我解决这些错误。

Iam new to flutter and i know there is a lot of answers for this question but its not working for me, please help me with this. These are my code

This is my data model

class SubjectModel {
  int? id;
  final String sub;


  SubjectModel({required this.sub, this.id}): assert(sub != null);

  static SubjectModel fromMap(Map<String, Object?>map)
  {
    final id = map['id'] as int;
    final sub = map['name'] as String;

    return SubjectModel(id: id,sub: sub);
  }
}

This is db helper

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:schoolmanagement/subject/datamodel3.dart';
import 'package:sqflite/sqflite.dart';
// import 'datamodel2.dart';

ValueNotifier<List<SubjectModel>> subjectlistNotifier = ValueNotifier([]);

late Database _db;

Future<void> initializeDataBasess()async{
  _db = await openDatabase('subject.db',
      version: 1,
      onCreate: (Database db, int version) async{
        await db.execute(
            'CREATE TABLE subject(id INTEGER PRIMARY KEY, sub TEXT) ');
      });
}

Future<void> addSubject(SubjectModel valuess) async{
  await _db.rawQuery(
      'INSERT INTO subject(sub) VALUES(?)',[valuess.sub]);
  getAllSubject();
}

Future<void> getAllSubject() async{
  final _valuess = await _db.rawQuery('SELECT * FROM subject');
  print(_valuess);
  subjectlistNotifier.value.clear();
  _valuess.forEach((map){
    final subj = SubjectModel.fromMap(map);
    subjectlistNotifier.value.add(subj);
    subjectlistNotifier.notifyListeners();
  });
}

Future<void> deleteSubject(int id) async{
  await _db.rawDelete('DELETE FROM subject WHERE id = ?', [id]);
  getAllSubject();
}

Adding data when clicking button

import 'package:flutter/material.dart';
import 'datamodel3.dart';
import 'function3.dart';

class AddSubjectWidget extends StatelessWidget {
  AddSubjectWidget({Key? key}) : super(key: key);

  final _subController = TextEditingController();


  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.all(20),
      child: Column(
        children: [
          TextFormField(
            controller: _subController,
            decoration: InputDecoration(
                border: OutlineInputBorder(),
                hintText: 'Name'
            ),
          ),
          SizedBox(height: 20,),
          // Row(
          //   children: [
          ElevatedButton.icon(
            onPressed: () {
              onAddSubjectButtonClicked();
            },
            icon: Icon(Icons.add),
            label: Text('Add Subject'),
          ),
          SizedBox(width: 20,),
        ],
      ),
    );
  }

  Future<void> onAddSubjectButtonClicked() async {
    final _sub = _subController.text.trim();
    if (_sub.isEmpty) {
      return;
    }
    final _subject = SubjectModel(sub: _sub);
    addSubject(_subject);
  }
}

This is listing data from database

import 'package:flutter/material.dart';
import 'datamodel3.dart';
import 'function3.dart';

class ListSubjectWidget extends StatefulWidget {
  const ListSubjectWidget({Key? key}) : super(key: key);

  @override
  State<ListSubjectWidget> createState() => _ListSubjectWidgetState();
}
class _ListSubjectWidgetState extends State<ListSubjectWidget> {

  @override
  Widget build(BuildContext context) {
    return ValueListenableBuilder(
      valueListenable: subjectlistNotifier,
      builder: (BuildContext ctxs,
          List<SubjectModel> subjectList,
          Widget? child){
        return ListView.separated(
          itemBuilder: (ctxs, indexs) {
            final datass = subjectList[indexs];
            return ListTile(
              title: Text(datass.sub),
              isThreeLine: true,
              trailing: IconButton(onPressed: (){
                if (datass.id != null){
                  deleteSubject(datass.id!);
                }else{
                  print("Subject is null, unable to delete");
                }
              },
                icon: Icon(Icons.delete,color: Colors.red,),),
            );
          },
          separatorBuilder: (ctxs, indexs){
            return Divider();
          },
          itemCount: subjectList.length,
        );
      },
    );
  }
}

This is the home screen

import 'package:dropdownfield2/dropdownfield2.dart';
import 'package:flutter/material.dart';
import 'datamodel3.dart';
import 'function3.dart';
import 'list3.dart';

class Subscreen extends StatefulWidget {
  const Subscreen({Key? key}) : super(key: key);

  @override
  State<Subscreen> createState() => _SubscreenState();
}

class _SubscreenState extends State<Subscreen> {
  final subjectselected = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Select Subject"),
        centerTitle: true,
      ),
      body: Container(
        // height: MediaQuery.of(context).size.height,
        // width: MediaQuery.of(context).size.width,
        padding: EdgeInsets.all(20),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            SizedBox(height: 20,),
            DropDownField(
              controller: subjectselected,
              hintText: "Select Subject",
              enabled: true,
              items: subject,
              itemsVisibleInDropdown: 5,
              onValueChanged: (value){
                setState(() {
                  selectsubject = value;
                });
              },
            ),
            SizedBox(height: 30,),
                  Text(
                selectsubject,
              style: TextStyle(
                fontSize: 20
              ),
              textAlign: TextAlign.center,),
            TextFormField(
              controller: subjectselected,
            ),
            ElevatedButton.icon(
              onPressed: () {
                // onAddSubjectButtonClicked();
              },
              icon: Icon(Icons.add),
              label: Text('Add Subject'),
            ),
            // Expanded(child: ListSubjectWidget()),
            Container(
                height:100,
                width: 100,
                child: ListSubjectWidget()),
                  // ListSubjectWidget()
                  // Expanded(child: ListSubjectWidget()),
            ]
        ),
      ),
    );
  }
}


String selectsubject = "";
final subjectselected = TextEditingController();

  List<String> subject = [
    "Maths",
    "Physics",
    "Chemistry",
    "Biology",
    "Electronics",
    "English",
    "Hindi",
    "Social",
    "PT",
    "Computer",
  ];

Future<void> onAddSubjectButtonClicked() async {
  final _sub = subjectselected.text.trim();
  if (_sub.isEmpty) {
    return;
  }
  final _subject = SubjectModel(sub: _sub);
  addSubject(_subject);
}

Please help me with these error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文