Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: The argument type 'Future' can't be assigned to the parameter type 'void Function()'

While I am passing value from home page to source page it shows an error: The argument type 'Future' can't be assigned to the parameter type 'void Function()'. (argument_type_not_assignable at [strong text] lib\home.dart:15)

Where I am doing wrong??

Home page -

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,         ),       ),     );   } } 

Below page is where I wanna use home page value-

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),         ),       ),     );   } } 
like image 285
mdhv_kothari Avatar asked Sep 02 '19 18:09

mdhv_kothari


Video Answer


1 Answers

Replace

onPressed: Navigator.push(...) 

with

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

If you need to use await keyword, you can do

onPressed: () async {   await Navigator.push(...);   await anyOtherMethod(); } 
like image 156
CopsOnRoad Avatar answered Sep 18 '22 18:09

CopsOnRoad