Flutter“此函数的返回类型为void,无法使用”
Posted
技术标签:
【中文标题】Flutter“此函数的返回类型为void,无法使用”【英文标题】:Flutter "this function has a return type of void and cannot be used" 【发布时间】:2020-11-23 08:25:05 【问题描述】:我收到此错误:- 此表达式的类型为“void”,因此无法使用其值。 尝试检查您是否使用了正确的 API;可能有一个函数或调用会返回您没想到的 void。还要检查类型参数和变量,它们也可能是无效的。
在此代码中的第 134 行:-
class toDoList extends StatefulWidget
bool data = false;
@override
createState()
return new toDoListState();
class toDoListState extends State<toDoList>
List<String> tasks = [];
List<String> completedTasks = [];
List<String> descriptions = [];
List<bool> importance = [];
@override
Widget build(BuildContext context)
return Scaffold
(
body: buildToDoList(),
floatingActionButton: new FloatingActionButton
(
onPressed: addToDoItemScreen,
tooltip: 'Add Task',
child: new Icon(Icons.add),
),
);
Widget buildToDoList()
return new ListView.builder
(
itemBuilder: (context, index)
if(index < tasks.length)
return row(tasks[index], descriptions[index], index);
,
);
Widget row(String task, String description, int index)
return Dismissible(
key: UniqueKey(),
background: Container(color: Colors.red, child: Align(alignment: Alignment.center, child: Text('DELETE', textAlign: TextAlign.center, style: TextStyle(color: Colors.white, fontSize: 18),))),
direction: DismissDirection.horizontal,
onDismissed: (direction)
setState(()
tasks.removeAt(index);
if(completedTasks.contains(task))
completedTasks.removeAt(index);
descriptions.removeAt(index);
importance.removeAt(index);
);
Scaffold.of(context).showSnackBar(SnackBar(content: Text(task+" dismissed")));
,
child: CheckboxListTile(
controlAffinity: ListTileControlAffinity.leading,
title: Text(task, style: (completedTasks.contains(task)) ? TextStyle(decoration: TextDecoration.lineThrough) : TextStyle(),),
subtitle: (importance[index]) ? Text('This is important') : Text('No it\'s not'),
value: completedTasks.contains(task),
onChanged: (bool value)
setState(()
if(!completedTasks.contains(task))
completedTasks.add(task);
else
completedTasks.remove(task);
);
,
));
void addToDoItemScreen()
int index = tasks.length;
while (importance.length > tasks.length)
importance.removeLast();
importance.add(false);
Navigator.of(context).push(new MaterialPageRoute(builder: (context)
return StatefulBuilder(builder: (context, setState) // this is new
return new Scaffold(
appBar: new AppBar(title: new Text('Add a new task')),
body: Form(
child: Column(
children: <Widget>[
TextField(
autofocus: true,
onSubmitted: (name)
addToDoItem(name);
//Navigator.pop(context); // Close the add todo screen
,
decoration: new InputDecoration(
hintText: 'Enter something to do...',
contentPadding: const EdgeInsets.all(20.0),
border: OutlineInputBorder()),
),
TextField(
//autofocus: true,
onSubmitted: (val)
addDescription(val, index);
,
decoration: new InputDecoration(
hintText: 'Enter a task decription...',
contentPadding: const EdgeInsets.all(20.0),
border: OutlineInputBorder()),
),
Row(
children: <Widget> [
Switch(
value: importance[index],
onChanged: (val)
setState(()
);
impTask(index);
,
),
Text('Important Task', style: TextStyle(fontSize: 18)),
],
),
RaisedButton(onPressed: Navigator.pop(context),)
],
),
));
);
));
void addToDoItem(String task)
setState(()
tasks.add(task);
descriptions.add("No description");
);
void addDescription(String desc, int index)
setState(()
descriptions[index] = desc;
);
void impTask(int index)
setState(()
if(importance[index])
importance[index] = false;
else
importance[index] = true;
);
我不明白这是什么。我是新来的。这是我的第一个应用程序。有人可以帮我解决这个问题吗?
【问题讨论】:
改用这个:RaisedButton(onPressed: () => Navigator.pop(context),)
【参考方案1】:
问题在于您的RaisedButton
onPressed。
onPressed
属性是一个 VoidCallback
,它接受一个 Function
。
改成下面的代码:
RaisedButton(onPressed: () => Navigator.pop(context),)
【讨论】:
我认为这里看到的“胖箭头”函数样式更可取。【参考方案2】:如果你想调用一个函数,试试这个:
floatingActionButton: new FloatingActionButton
(
onPressed: () addToDoItemScreen(); ,
),
你的功能是这样的:
void addToDoItemScreen()
//body
如果您想导航到不同的屏幕,则必须将上下文作为参数传递:
floatingActionButton: new FloatingActionButton
(
onPressed: () addToDoItemScreen(context); ,
),
和功能:
void addToDoItemScreen(BuildContext context))
//body
【讨论】:
【参考方案3】:将“onPressed: addToDoItemScreen”改为“onPressed: ()=>addToDoItemScreen”
【讨论】:
请添加支持文本,为什么会这样? 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案4】:受上述 Void 回答的启发,我只是将代码提取到一个函数中,它具有相同的行为,但我认为它更有条理,因为您可以重用代码:)
回答: https://***.com/a/63226912/10025125
_back(BuildContext context)
Navigator.pop(context);
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
elevation: 2.0,
leading: IconButton(
key: const ValueKey('back'),
icon: const Icon(Icons.arrow_back),
onPressed: () => _back(context),
),
title: const Text('Foo Title'),
),
body: _buildBody(context),
);
【讨论】:
以上是关于Flutter“此函数的返回类型为void,无法使用”的主要内容,如果未能解决你的问题,请参考以下文章
[Flutter] flutter项目一直卡在 Running Gradle task 'assembleDebug'...
flutter 日志输出,Flutter打印日志,flutter log,flutter 真机日志
Flutter开发 Flutter 包和插件 ( Flutter 包和插件简介 | 创建 Flutter 插件 | 创建 Dart 包 )
如何解决flutter gradle build error?C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 991