无法解决 "Null check operator used on a null value"
Not able to solve "Null check operator used on a null value"
我正在尝试在 flutter 中创建一个 to-do 列表应用程序。我遇到了一个小部件的问题,该小部件可帮助我根据标题或描述编辑已创建的待办事项小部件。
这是我的待办事项首页的图片
我的编辑按钮的这张照片
我在这个小部件中按下保存按钮后遇到问题
这是我遇到的错误
════════ Exception caught by gesture ═══════════════════════════════════════════
The following _CastError was thrown while handling a gesture:
Null check operator used on a null value
When the exception was thrown, this was the stack
#0 _EditTodoPageState.saveTodo
package:todolist/Edit_Todo_Page.dart:47
#1 _InkResponseState._handleTap
package:flutter/…/material/ink_well.dart:989
#2 GestureRecognizer.invokeCallback
package:flutter/…/gestures/recognizer.dart:198
#3 TapGestureRecognizer.handleTapUp
package:flutter/…/gestures/tap.dart:608
#4 BaseTapGestureRecognizer._checkUp
package:flutter/…/gestures/tap.dart:296
#5 BaseTapGestureRecognizer.handlePrimaryPointer
package:flutter/…/gestures/tap.dart:230
#6 PrimaryPointerGestureRecognizer.handleEvent
package:flutter/…/gestures/recognizer.dart:563
#7 PointerRouter._dispatch
package:flutter/…/gestures/pointer_router.dart:94
#8 PointerRouter._dispatchEventToRoutes.<anonymous closure>
package:flutter/…/gestures/pointer_router.dart:139
(elided 3 frames from dart:async)
Handler: "onTap"
Recognizer: TapGestureRecognizer#25bd2
debugOwner: GestureDetector
state: possible
won arena
finalPosition: Offset(189.1, 309.1)
finalLocalPosition: Offset(67.7, 11.1)
button: 1
sent tap down
════════════════════════════════════════════════════════════════════════════════
这是我的编辑待办小部件
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:todolist/todo.dart';
import './todos.dart';
import './todo_form_widget.dart';
class EditTodoPage extends StatefulWidget {
final Todo todo;
const EditTodoPage({Key? key, required this.todo}) : super(key: key);
@override
State<EditTodoPage> createState() => _EditTodoPageState();
}
class _EditTodoPageState extends State<EditTodoPage> {
final _formKey = GlobalKey<FormState>();
late String title;
late String description;
@override
void initState() {
super.initState();
title = widget.todo.title;
description = widget.todo.description;
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Edit Todo"),
),
body: Padding(
padding: EdgeInsets.all(16),
child: Form(
child: TodoFormWidget(
title: title,
description: description,
onChangedTitle: (title) => setState(() => this.title = title),
onChangedDescription: (description) =>
setState(() => this.description = description),
onSavedTodo: saveTodo,
),
),
));
}
saveTodo() {
final isValid = _formKey.currentState!.validate();
if (!isValid) {
return;
} else {
final provider = Provider.of<TodosProvider>(context, listen: false);
provider.updateTodo(widget.todo, title, description);
Navigator.of(context).pop();
}
}
}
我在“saveTodo()”方法中遇到错误。我无法解决这个错误。
这是我的 Provider 小部件
import 'package:flutter/cupertino.dart';
import 'package:todolist/todo.dart';
import 'package:provider/provider.dart';
class TodosProvider extends ChangeNotifier {
List<Todo> _todos = [
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
];
List<Todo> get todos => _todos.where((todo) => todo.isDone == false).toList();
List<Todo> get todosCompleted =>
_todos.where((todo) => todo.isDone == true).toList();
void addTodo([Todo? todo]) {
_todos.add(todo!);
notifyListeners();
}
void removeTodo(Todo todo) {
_todos.remove(todo);
notifyListeners();
}
bool toggleTodoStatus(Todo todo) {
todo.isDone = !todo.isDone;
notifyListeners();
return todo.isDone;
}
void updateTodo(Todo todo, String title, String description) {
todo.title = title;
todo.description = description;
notifyListeners();
}
}
请帮我解决这个错误。
我认为,您没有在 Form
小部件中使用 _formKey
,这就是为什么 _formKey
currentState
变得空的原因。尝试在 Form
小部件中使用 _formKey
并检查它是否不等于 null。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:todolist/todo.dart';
import './todos.dart';
import './todo_form_widget.dart';
class EditTodoPage extends StatefulWidget {
final Todo todo;
const EditTodoPage({Key? key, required this.todo}) : super(key: key);
@override
State<EditTodoPage> createState() => _EditTodoPageState();
}
class _EditTodoPageState extends State<EditTodoPage> {
final _formKey = GlobalKey<FormState>();
late String title;
late String description;
@override
void initState() {
super.initState();
title = widget.todo.title;
description = widget.todo.description;
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Edit Todo"),
),
body: Padding(
padding: EdgeInsets.all(16),
child: Form(
key: _formKey,
child: TodoFormWidget(
title: title,
description: description,
onChangedTitle: (title) => setState(() => this.title = title),
onChangedDescription: (description) =>
setState(() => this.description = description),
onSavedTodo: saveTodo,
),
),
),
);
}
saveTodo() {
final isValid = _formKey.currentState != null && _formKey.currentState!.validate();
if (!isValid) {
return;
} else {
final provider = Provider.of<TodosProvider>(context, listen: false);
provider.updateTodo(widget.todo, title, description);
Navigator.of(context).pop();
}
}
}
我正在尝试在 flutter 中创建一个 to-do 列表应用程序。我遇到了一个小部件的问题,该小部件可帮助我根据标题或描述编辑已创建的待办事项小部件。
这是我的待办事项首页的图片
我的编辑按钮的这张照片
我在这个小部件中按下保存按钮后遇到问题
这是我遇到的错误
════════ Exception caught by gesture ═══════════════════════════════════════════
The following _CastError was thrown while handling a gesture:
Null check operator used on a null value
When the exception was thrown, this was the stack
#0 _EditTodoPageState.saveTodo
package:todolist/Edit_Todo_Page.dart:47
#1 _InkResponseState._handleTap
package:flutter/…/material/ink_well.dart:989
#2 GestureRecognizer.invokeCallback
package:flutter/…/gestures/recognizer.dart:198
#3 TapGestureRecognizer.handleTapUp
package:flutter/…/gestures/tap.dart:608
#4 BaseTapGestureRecognizer._checkUp
package:flutter/…/gestures/tap.dart:296
#5 BaseTapGestureRecognizer.handlePrimaryPointer
package:flutter/…/gestures/tap.dart:230
#6 PrimaryPointerGestureRecognizer.handleEvent
package:flutter/…/gestures/recognizer.dart:563
#7 PointerRouter._dispatch
package:flutter/…/gestures/pointer_router.dart:94
#8 PointerRouter._dispatchEventToRoutes.<anonymous closure>
package:flutter/…/gestures/pointer_router.dart:139
(elided 3 frames from dart:async)
Handler: "onTap"
Recognizer: TapGestureRecognizer#25bd2
debugOwner: GestureDetector
state: possible
won arena
finalPosition: Offset(189.1, 309.1)
finalLocalPosition: Offset(67.7, 11.1)
button: 1
sent tap down
════════════════════════════════════════════════════════════════════════════════
这是我的编辑待办小部件
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:todolist/todo.dart';
import './todos.dart';
import './todo_form_widget.dart';
class EditTodoPage extends StatefulWidget {
final Todo todo;
const EditTodoPage({Key? key, required this.todo}) : super(key: key);
@override
State<EditTodoPage> createState() => _EditTodoPageState();
}
class _EditTodoPageState extends State<EditTodoPage> {
final _formKey = GlobalKey<FormState>();
late String title;
late String description;
@override
void initState() {
super.initState();
title = widget.todo.title;
description = widget.todo.description;
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Edit Todo"),
),
body: Padding(
padding: EdgeInsets.all(16),
child: Form(
child: TodoFormWidget(
title: title,
description: description,
onChangedTitle: (title) => setState(() => this.title = title),
onChangedDescription: (description) =>
setState(() => this.description = description),
onSavedTodo: saveTodo,
),
),
));
}
saveTodo() {
final isValid = _formKey.currentState!.validate();
if (!isValid) {
return;
} else {
final provider = Provider.of<TodosProvider>(context, listen: false);
provider.updateTodo(widget.todo, title, description);
Navigator.of(context).pop();
}
}
}
我在“saveTodo()”方法中遇到错误。我无法解决这个错误。
这是我的 Provider 小部件
import 'package:flutter/cupertino.dart';
import 'package:todolist/todo.dart';
import 'package:provider/provider.dart';
class TodosProvider extends ChangeNotifier {
List<Todo> _todos = [
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
Todo(
createdTime: DateTime.now(),
title: "Wake up at 6:00 AM in the morning!!!",
),
];
List<Todo> get todos => _todos.where((todo) => todo.isDone == false).toList();
List<Todo> get todosCompleted =>
_todos.where((todo) => todo.isDone == true).toList();
void addTodo([Todo? todo]) {
_todos.add(todo!);
notifyListeners();
}
void removeTodo(Todo todo) {
_todos.remove(todo);
notifyListeners();
}
bool toggleTodoStatus(Todo todo) {
todo.isDone = !todo.isDone;
notifyListeners();
return todo.isDone;
}
void updateTodo(Todo todo, String title, String description) {
todo.title = title;
todo.description = description;
notifyListeners();
}
}
请帮我解决这个错误。
我认为,您没有在 Form
小部件中使用 _formKey
,这就是为什么 _formKey
currentState
变得空的原因。尝试在 Form
小部件中使用 _formKey
并检查它是否不等于 null。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:todolist/todo.dart';
import './todos.dart';
import './todo_form_widget.dart';
class EditTodoPage extends StatefulWidget {
final Todo todo;
const EditTodoPage({Key? key, required this.todo}) : super(key: key);
@override
State<EditTodoPage> createState() => _EditTodoPageState();
}
class _EditTodoPageState extends State<EditTodoPage> {
final _formKey = GlobalKey<FormState>();
late String title;
late String description;
@override
void initState() {
super.initState();
title = widget.todo.title;
description = widget.todo.description;
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Edit Todo"),
),
body: Padding(
padding: EdgeInsets.all(16),
child: Form(
key: _formKey,
child: TodoFormWidget(
title: title,
description: description,
onChangedTitle: (title) => setState(() => this.title = title),
onChangedDescription: (description) =>
setState(() => this.description = description),
onSavedTodo: saveTodo,
),
),
),
);
}
saveTodo() {
final isValid = _formKey.currentState != null && _formKey.currentState!.validate();
if (!isValid) {
return;
} else {
final provider = Provider.of<TodosProvider>(context, listen: false);
provider.updateTodo(widget.todo, title, description);
Navigator.of(context).pop();
}
}
}