Yapılacaklar listesi uygulaması yapıyorum. Görev kitapçığı diye bir şey ayarladım. Veri tabanında bir tabloda tutuyorum. Görev oluşturunca başka bir tabloya kitapçık id'si ile kaydediyor.
Veri tabanından tabloları çekip gridviewda göstermek istediğim zaman hata alıyorum. FutureBuilder kısmında hata veriyor.
Hata
The following _CastError was thrown building FutureBuilder<List<taskBooksDataModel>>(state: _FutureBuilderState<List<taskBooksDataModel>>#56975):
Null check operator used on a null value
The relevant error-causing widget was:
FutureBuilder<List<taskBooksDataModel>> FutureBuilder:file:///C:/Users/Administrator/Desktop/todolist/lib/screens/generalListerWidgets/taskBookWidget.dart:22:12
When the exception was thrown, this was the stack:
#0 SnackBarState.initState (package:flutter/src/material/snack_bar.dart:391:21)
#1 StatefulElement.firstBuild (package:flutter/src/widgets/framework.dart:5015:57)
#2 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4853:5)
... Normal element mounting (50 frames)
#52 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3863:16)
#53 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6435:36)
#54 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6447:32)
... Normal element mounting (387 frames)
Veri Modeli
class taskBooksDataModel {
late int taskBookId;
late String taskBookName;
taskBooksDataModel() {}
taskBooksDataModel.withOutId(this.taskBookName);
taskBooksDataModel.withInfo(this.taskBookId, this.taskBookName);
taskBooksDataModel.justWithId(this.taskBookId);
static List<taskBooksDataModel> convertToTaskBookDataModel(List<Map<String, Object?>> value) {
List<taskBooksDataModel> newList = [];
for(int i = 0; i < value.length; i++) {
newList.add(new taskBooksDataModel.withInfo(int.parse(value["c_id"].toString()), value["c_name"].toString()));
}
return newList;
}
}
Veri tabanı fonkisyonları
import 'package:flutter/material.dart';
import "package:flutter/cupertino.dart";
import 'package:todolist/dataModels/taskBookDataModel.dart';
import 'package:todolist/database/database.dart';
import 'package:todolist/screens/tasksScreen/tasksScreen.dart';
class taskBooksWidget extends StatefulWidget {
late String searchingValue;
Function callback;
taskBooksWidget(this.callback, {this.searchingValue = ""});
@override
State<taskBooksWidget> createState() => _taskBooksWidgetState();
}
class _taskBooksWidgetState extends State<taskBooksWidget> {
@override
Widget build(BuildContext context) {
databaseHelper databaseTrans = new databaseHelper();
return FutureBuilder(
future: databaseTrans.getTables(whereValue: widget.searchingValue),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return taskBookErrorWidget(context);
} else if (snapshot.data == null) {
return taskBookErrorWidget(context);
} else {
return GridView.count(
crossAxisCount: 3,
children: List.generate(snapshot.data!.length, (i) {
return Dismissible(
key: Key(snapshot.data![i].taskBookId.toString()),
direction: DismissDirection.horizontal,
child: Container(
margin: EdgeInsets.all(10),
alignment: Alignment.center,
decoration: BoxDecoration(
color: Colors.white10,
borderRadius: BorderRadius.circular(30),
),
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => tasksScreen(
snapshot.data![i].taskBookId,
snapshot.data![i].taskBookName)));
},
child: Text(snapshot.data![i].taskBookName.toString(),
style: TextStyle(color: Colors.white)),
),
),
onDismissed: (DismissDirection direction) {
databaseTrans.deleteTaskBook(
new taskBooksDataModel.justWithId(
snapshot.data![i].taskBookId));
widget.callback();
});
}),
);
}
},
);
}
SnackBar taskBookErrorWidget(BuildContext context) {
return SnackBar(
content: Text(
"There is no task book",
style: TextStyle(fontSize: 20, color: Colors.white),
),
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.pinkAccent,
dismissDirection: DismissDirection.startToEnd,
);
}
}