颤振 '二传手 'task= ' 在空值上被调用



大家! 我正在学习 Flutter/Dart,但一直遇到实例化和初始化问题。 目前我正在编写一个可重新排序的列表,但由于某种原因,我无法填充该列表,因为我的实例有一些问题......(我认为问题出在下面的这些行上(

List<String> tasks = [];
MyTask t;
tasks = [ t.task = 'Buy ice cream', t.task = 'Learn Flutter', t.task = 'Read books' ];)

你能检查一下并给我一个线索吗? 提前谢谢。欢迎任何寻求文档的提示! 例外:

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building _BodyBuilder:
The setter 'task=' was called on null.
Receiver: null
Tried calling: task="Buy ice cream"

相关代码:

import 'package:flutter/material.dart';
import './bottomNavigationBar.dart';
import './ViewFeed.dart';
import './ViewNewTodo.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
//home: MyScaffold(),
initialRoute: '/',
routes: {
'/':(context) => MyFeed(),
'/toDo':(context) => MyScaffold(),
'/newToDo':(context) => MyNewTodo(),
},
);
}
}
class MyScaffold extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('My ToDoS'),
),
body: MyReorderableTaskList(),
floatingActionButton: MyFloatingActionButtonNewTodo() ,
bottomNavigationBar: MyBottomNavigationBar(),
);
}
}
//Reorderable list elements
//FloatingActionButton
class MyFloatingActionButtonNewTodo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FloatingActionButton(
child: Icon(Icons.add),
tooltip: 'Idea',
onPressed: ()=>{ Navigator.pushNamed(context, '/newToDo') },
);
}
}
class MyTask{
String task;
MyTask(this.task);
}
//ReorderableListView  implementation
class MyReorderableTaskList extends StatefulWidget {
@override
_MyReorderableTaskListState createState() => _MyReorderableTaskListState();
}
class _MyReorderableTaskListState extends State<MyReorderableTaskList> {
List<String> tasks = [];
MyTask t;
void initState(){
tasks = [ t.task = 'Buy ice cream', t.task = 'Learn Flutter', t.task = 'Read books' ];
super.initState();
}
@override
Widget build(BuildContext context) {
return ReorderableListView(
onReorder: _onReorder,
children: List.generate(
tasks.length,
(index){ return MyListView(index, Key('$index'), tasks ); }
),
);
}
void _onReorder(int oldIndex, int newIndex){
setState(() {
if(newIndex > oldIndex) { newIndex -= 1; }
final String item = tasks.removeAt(oldIndex);
tasks.insert(newIndex, item);
});
}
}
class MyListView extends StatefulWidget {
final int index;
final Key key;
final List<String> listTasks;
MyListView(this.index, this.key, this.listTasks);
@override
_MyListViewState createState() => _MyListViewState();
}
class _MyListViewState extends State<MyListView> {
@override
Widget build(BuildContext context) {
return Card(
margin: EdgeInsets.all(6),
child: InkWell(
splashColor: Colors.blue,
onTap: ()=>{ MaterialState.focused },
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
title: Text('Tarea: ${widget.listTasks[widget.index]} | ${widget.index}',),
),
],
),
),
);
}
}

MyTask t;为空。t实际上还不是任何东西。您必须创建一个新对象MyTask()并将其分配给t

将其更改为

MyTask t = new MyTask("");

编辑:更彻底的解释

你不能只是声明MyTask t;然后尝试使用t,因为你还没有说t是什么。这就像宣布int a;然后尝试做print(a + 5)。您不能这样做,因为您尚未为a分配值。同样,MyTask t;表示您已经创建了一个名为t的变量,类型为MyTask。换句话说,您已经声明了一个变量t。但是你仍然必须初始化它,换句话说,t赋一个类型为MyTask的值,否则t的值将被null

所以总结一下,

MyTask t;
t.task = "Hello";

行不通,因为这就像做

int a;
int b = a + 5;

你不能在 a 上加 5,因为尽管你已经声明了变量a,但你还没有初始化它,所以它还没有值。

同样,您无法访问t.task属性,因为您还没有说t是什么。t只是null.

所以你必须通过实例化一个新的MyTask对象来初始化t-

MyTask t = new MyTask("");

括号内需要"",因为 MyTask 类构造函数需要一个参数。

class MyTask{
String task;
MyTask(this.task); // Parameter required to assign to the String task
}

这可能会对您有所帮助。

相关内容

  • 没有找到相关文章

最新更新