ошибка: тип аргумента Future не может быть назначен типу параметра void Function ()

Пока я передаю значение с домашней страницы на исходную страницу, отображается ошибка: тип аргумента «Future» не может быть назначен типу параметра «void Function ()». (тип_аргумента_not_assignable в [строгий текст] 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),
        ),
      ),
    );
  }
}

person mdhv_kothari    schedule 02.09.2019    source источник


Ответы (3)


Заменять

onPressed: Navigator.push(...)

с участием

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

Если вам нужно использовать ключевое слово await, вы можете сделать

onPressed: () async {
  await Navigator.push(...);
  await anyOtherMethod();
}
person CopsOnRoad    schedule 02.09.2019
comment
Спасибо! Но почему это работает? Вы можете это объяснить? - person Petro; 07.03.2020
comment
@Petro Navigator.push возвращает Future, а onPressed принимает void, поэтому вы не можете напрямую присвоить Navigator.push onPressed, однако, когда вы делаете onPressed: () => , вы просто выполняете Navigator.push(...) внутри обратного вызова, предоставленного onPressed. Надеюсь, что объяснил! - person CopsOnRoad; 07.03.2020
comment
Ах, я вижу, спасибо за то, что вы прошли через то, что очень ценно! - person Petro; 07.03.2020

Этот работал у меня в последних версиях

 onPressed: () {
          selectHandler();
 },
person Arun Prasad E S    schedule 16.02.2021
comment
Он не должен ничего делать с последними или более старыми версиями. Этот код по существу равен onPressed: selectHandler. - person CopsOnRoad; 01.04.2021
comment
@CopsOnRoad Так и есть. В последней версии OnPressed: selectHandler не работает с onPressed, так как вы не можете напрямую назначить void. с onPressed: () = ›selectHandler вы даете указание выполнить функцию внутри обратного вызова. - person Sesha Kiran; 19.05.2021
comment
@SeshaKiran Можете ли вы показать какой-нибудь код, подтверждающий ваше утверждение, что onPressed: selectHandler не будет работать? Единственный раз, когда вы можете столкнуться с ошибкой, - это когда вы вызываете метод для объекта, который еще не был инициализирован (например, когда вы используете ключевое слово late для ленивой инициализации). - person CopsOnRoad; 19.05.2021
comment
@CopsOnRoad Ключевое слово late не использовалось, но в простом случае оно не помогло мне. это был образец обучающего кода без какого-либо API. - person Arun Prasad E S; 19.05.2021
comment
@ArunPrasadES Код будет признателен. - person CopsOnRoad; 19.05.2021
comment
@CopsOnRoad Пожалуйста. найди код. Я добавил в качестве другого ответа. - person Sesha Kiran; 02.06.2021

person    schedule
comment
Во-первых, это не тот код, который я могу воспроизвести самостоятельно. Пожалуйста, разместите минимальный воспроизводимый код. Во-вторых, Function не рекомендуется использовать без параметра. Должно быть Function() - person CopsOnRoad; 02.06.2021