大家! 我正在学习 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
}
这可能会对您有所帮助。