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: () =&gt; 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与原生混编(iOS)

Flutter-布局

如何解决flutter gradle build error?C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 991