Flutter 颤振Todo在title=widget.title处返回null
我的Todolist有一个问题,它返回错误消息:“必须向文本小部件提供非空字符串。 'package:flatter/src/widgets/text.dart': 断言失败:第360行pos 10:“data!=null'”及其在类MyHomePage中的行标题:new Text(widget.title)。我已尝试将其更改为title:new Text(widget.title???),但这不起作用。是否有其他可行的解决方案Flutter 颤振Todo在title=widget.title处返回null,flutter,dart,Flutter,Dart,我的Todolist有一个问题,它返回错误消息:“必须向文本小部件提供非空字符串。 'package:flatter/src/widgets/text.dart': 断言失败:第360行pos 10:“data!=null'”及其在类MyHomePage中的行标题:new Text(widget.title)。我已尝试将其更改为title:new Text(widget.title???),但这不起作用。是否有其他可行的解决方案 void main() => runApp(new M
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Todos',
theme: new ThemeData(primarySwatch: Colors.deepOrange),
home: new MyHomePage(title: 'Todos'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
MyHomePageState createState() => new MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: TodoList(),
);
}
}
class TodoList extends StatefulWidget {
@override
State<StatefulWidget> createState() => TodoListState();
}
class TodoListState extends State {
DbHelper helper = DbHelper();
List<Todo> todos;
int count = 0;
@override
Widget build(BuildContext context) {
if (todos == null) {
todos = List<Todo>();
getData();
}
return Scaffold(
body: todoListItems(),
floatingActionButton: FloatingActionButton(
onPressed: () {
navigateToDetail(Todo('', 3, ''));
},
tooltip: "Add new Todo",
child: new Icon(Icons.add)),
);
}
ListView todoListItems() {
return ListView.builder(
itemCount: count,
itemBuilder: (BuildContext context, int position) {
return Card(
color: Colors.white,
elevation: 2,
child: ListTile(
leading: CircleAvatar(
backgroundColor: getColor(this.todos[position].priority),
child: Text(this.todos[position].priority.toString()),
),
title: Text(this.todos[position].title),
subtitle: Text(this.todos[position].date),
onTap: () {
debugPrint("Tapped on " + this.todos[position].id.toString());
navigateToDetail(this.todos[position]);
},
),
);
},
);
}
void getData() {
final dbFuture = helper.initializeDb();
dbFuture.then((result) {
final todosFuture = helper.getTodos();
todosFuture.then((result) {
List<Todo> todoList = List<Todo>();
count = result.length;
for (int i = 0; i < count; i++) {
todoList.add(Todo.fromObject(result[i]));
debugPrint(todoList[i].title);
}
setState(() {
todos = todoList;
count = count;
});
debugPrint("Items " + count.toString());
});
});
}
Color getColor(int priority) {
switch (priority) {
case 1:
return Colors.red;
break;
case 2:
return Colors.orange;
break;
case 3:
return Colors.green;
break;
default:
return Colors.green;
}
}
void navigateToDetail(Todo todo) async {
bool result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => TodoDetail(todo)),
);
if (result == true) {
getData();
}
}
}
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“待办事项”,
主题:新主题数据(原始样本:颜色。深橙色),
主页:新的MyHomePage(标题:“Todos”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
MyHomePageState createState()=>新建MyHomePageState();
}
类MyHomePageState扩展了状态{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新文本(widget.title),
),
正文:TodoList(),
);
}
}
类TodoList扩展了StatefulWidget{
@凌驾
State createState()=>TodoListState();
}
类TodoListState扩展了状态{
DbHelper=DbHelper();
列出待办事项;
整数计数=0;
@凌驾
小部件构建(构建上下文){
如果(todos==null){
todos=列表();
getData();
}
返回脚手架(
正文:todoListItems(),
浮动操作按钮:浮动操作按钮(
已按下:(){
导航细节(Todo('',3'');
},
工具提示:“添加新待办事项”,
子项:新图标(Icons.add)),
);
}
ListView todoListItems(){
返回ListView.builder(
itemCount:count,
itemBuilder:(构建上下文,int位置){
回程卡(
颜色:颜色,白色,
标高:2,
孩子:ListTile(
领先:CircleAvatar(
backgroundColor:getColor(this.todos[position].priority),
子项:文本(this.todos[position].priority.toString()),
),
标题:文本(this.todos[position].title),
字幕:文本(this.todos[position].date),
onTap:(){
debugPrint(“点击”+this.todos[position].id.toString());
导航详细信息(此.todos[位置]);
},
),
);
},
);
}
void getData(){
final dbFuture=helper.initializeDb();
dbFuture.then((结果){
final todosFuture=helper.getTodos();
todosFuture。然后((结果){
List-todoList=List();
count=result.length;
for(int i=0;iToModetail(todo)),
);
如果(结果==真){
getData();
}
}
}
请将此行标题:新文本(widget.title),
更改为标题:新文本(widget.title??),
first???”
这是一个空检查…当first为空时返回“
编辑 请对所有文本小部件重复此方法
child: Text(this.todos[position].priority.toString() ?? ""),
title: Text(this.todos[position].title ?? "" ),
subtitle: Text(this.todos[position].date ?? "" ),
标题:新文本(widget.title???)无法工作,并且我可以看到我的todo已在调试控制台中填充。调试控制台:颤振:项目4引发了另一个异常:必须向文本小部件提供非空字符串。@DavidRuland此错误来自文本小部件…我编辑了答案。我已运行了端口在代码中,你说你的错误是,并且它在本地没有显示错误。这是丢失数据的一个非常基本的错误,不会很复杂。特别是当它是硬编码的时候。你只是从一个类传递一个字符串到另一个类,没有太多的失败空间。你确定这是有错误的行吗?它使用了子项:文本(this.todos[position].priority.toString()??“”),标题:文本(this.todos[position].title??),副标题:文本(this.todos[position].date??)在每个文本中,所以现在可以看到我的todo和日期和Id。但是标题仍然为空,并且没有显示在todo中。所以需要查看。