【问题标题】:error: The argument type 'Future' can't be assigned to the parameter type 'void Function()'错误:参数类型“Future”不能分配给参数类型“void Function()”
【发布时间】:2020-01-05 18:13:22
【问题描述】:

当我将值从主页传递到源页面时,它显示错误:无法将参数类型“Future”分配给参数类型“void Function()”。 (argument_type_not_assignable at [strong text] lib\home.dart:15)

我哪里做错了??

首页 -

import 'package:flutter/material.dart';
import 'sourceScreen.dart';

class Home extends StatefulWidget {
  int value;
  Home({this.value});
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          onPressed: Navigator.push(context, MaterialPageRoute(builder: (context)=>SourceScreen({value:value}))), child: null,
        ),
      ),
    );
  }
}

下面是我想使用主页值的地方-

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'models/model.dart';
import 'models/card.dart';
import 'article.dart';

final API_KEY = '***';

Future<List<Source>> fetchNewsSource() async {
  final response = await http.get(
      'https://newsapi.org/v2/sources?language=en&country=in&apiKey=$API_KEY');

  if (response.statusCode == 200) {
    List sources = json.decode(response.body)['sources'];
    return sources.map((source) => new Source.formJson(source)).toList();
  } else {
    throw Exception('Fail to load data');
  }
}

class SourceScreen extends StatefulWidget {
  @override
  _SourceScreenState createState() => _SourceScreenState();
}

class _SourceScreenState extends State<SourceScreen> {
  var list_source;
  var refreshKey = GlobalKey<RefreshIndicatorState>();

  @override
  void initState() {
    super.initState();
    refreshListSource();
  }

  Future<Null> refreshListSource() async {
    refreshKey.currentState?.show(atTop: false);
    setState(() {
      list_source = fetchNewsSource();
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Color.fromRGBO(58, 66, 86, 1.0),
        appBar: AppBar(
          elevation: 1.0,
          backgroundColor: Color.fromRGBO(58, 66, 86, 1.0),
          title: Text('uTTerNews'),
        ),
        body: Center(
          child: RefreshIndicator(
              child: FutureBuilder<List<Source>>(
                future: list_source,
                builder: (context, snapshot) {
                  if (snapshot.hasError) {
                    Text('Error: ${snapshot.error}');
                  } else if (snapshot.hasData) {
                    List<Source> sources = snapshot.data;
                    return new ListView(
                        children: sources
                            .map((source) =>
                            GestureDetector(
                              onTap: () {
                                Navigator.push(context, MaterialPageRoute(
                                    builder: (context) =>
                                        articleScreen(source: source,)));
                              },
                              child: card(source),
                            ))
                            .toList());
                  }
                  return CircularProgressIndicator();
                },
              ),
              onRefresh: refreshListSource),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter statelesswidget


    【解决方案1】:

    替换

    onPressed: Navigator.push(...)
    

    onPressed: () => Navigator.push(...)
    

    如果你需要使用await关键字,你可以这样做

    onPressed: () async {
      await Navigator.push(...);
      await anyOtherMethod();
    }
    

    【讨论】:

    • 谢谢!但为什么这行得通?你能解释一下吗?
    • @Petro Navigator.push 返回一个FutureonPressed 接受void,这就是为什么你不能直接将Navigator.push 分配给onPressed,但是当你这样做时@987654331 @ 你只是在onPressed 提供的回调中执行Navigator.push(...)。希望得到解释!
    • 啊,我明白了,感谢您运行这么多,非常感谢!
    【解决方案2】:

    这个在最新版本中对我有用

     onPressed: () {
              selectHandler();
     },
    

    【讨论】:

    • 它与最新或旧版本无关。这段代码本质上等于onPressed: selectHandler
    • @CopsOnRoad 确实如此。在最新版本中, OnPressed: selectHandler 对 onPressed 不起作用,因为您不能直接分配 void。使用 onPressed: () => selectHandler 您指示在回调中执行函数。
    • @SeshaKiran 您能否展示一些代码来支持您的声明,即onPressed: selectHandler 不起作用?唯一可能遇到错误的情况是在调用尚未初始化的对象上的方法时(例如,当您使用 late 关键字进行延迟初始化时)。
    • @CopsOnRoad 没有使用 late 关键字,但在一个简单的情况下它对我不起作用。这是一个没有任何 API 的示例学习代码。
    • @ArunPrasadES 代码将不胜感激。
    【解决方案3】:
        @CopsOnRoad -- Here is the sample code that is working for me.
    
    *Answer.dart file*
        
        import 'package:flutter/material.dart';
        
        class Answer extends StatelessWidget {
          final Function selectHandler;
        
          // ignore: use_key_in_widget_constructors
          const Answer(this.selectHandler);
        
          @override
          Widget build(BuildContext context) {
            return Container(
              width: double.infinity,
              child: RaisedButton(
                color: Colors.grey,
                textColor: Colors.black,
                child: Text('Answer 1'),
                **onPressed: () => selectHandler()**,
              ),
            );
          }
        }
        
        *Main.dart file snippet*
        
        @override
          Widget build(BuildContext context) {
            var questions = [
              'What\'s your favorite color?',
              'What\'s your favorite animal?'
            ];
            return MaterialApp(
              home: Scaffold(
                appBar: AppBar(
                  title: Text(questions[_questionIndex]),
                ),
                body: Column(
                  children: <Widget>[
                    Question(questions[_questionIndex]),
                    **Answer(_answerQuestion)**,
                    Answer(_answerQuestion),
                    Answer(_answerQuestion),
                  ],
                ),
              ),
            );
          }
        }
    

    【讨论】:

    • 首先,这不是我可以自己复制的代码。请发布最小的可重现代码。其次,Function不建议不带参数使用。应该是Function()
    【解决方案4】:

    只需将final Function selectHandler改为final VoidCallback selectHandler;

    【讨论】:

      猜你喜欢
      • 2021-02-12
      • 2020-08-21
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2021-11-24
      • 2021-10-16
      • 2021-10-10
      • 2021-10-22
      相关资源
      最近更新 更多