Hello guys im new to flutter and was trying to make a news app with API. but i have an error in my homepage class, in
itemBuilder: (context, index) => listTile(articles[index])
in the (articles[index])
there is a red underland says "2 positional argument(s) expected, but 1 found. Try adding the missing". this error happen after i add "BuildContext context" to add an InkWell widget in my ListTile class
Widget listTile(Article article, BuildContext context) {
return InkWell(
onTap: (){
Navigator.push(
context, MaterialPageRoute(
builder: (
context) => NewsDetail(
article: article))
);
},
so here is my full homepage class code
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:medreminder/NewsArticle/components/list_tile.dart';
import 'package:medreminder/NewsArticle/models/article_models.dart';
import 'package:medreminder/NewsArticle/services/api_service.dart';
class NewsHomePage extends StatelessWidget {
//const NewsHomePage({super.key});
ApiService client = ApiService();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Get.isDarkMode?Colors.grey[600]:Colors.white,
leading: IconButton(
onPressed: ()=>Get.back(),
icon: Icon(Icons.arrow_back_ios,
color: Get.isDarkMode?Colors.white:Colors.grey
),
),
title: Text("News & Article", style: TextStyle(
color: Get.isDarkMode?Colors.white:Colors.black
),),
),
body: FutureBuilder<List<Article>>(
future: client.getArticle(),
builder: (BuildContext context, AsyncSnapshot<List<Article>> snapshot) {
if(snapshot.hasData&&snapshot.data!=null&& snapshot.data!.isNotEmpty){
List<Article>? articles = snapshot.data;
return ListView.builder(
itemCount: articles!.length,
itemBuilder: (context, index) => listTile(articles[index])
);
}
return Center(child: CircularProgressIndicator(),);
},
),
);
}
}
and here is my ListTile class
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:medreminder/NewsArticle/models/article_models.dart';
import 'package:medreminder/NewsArticle/pages/news_detail.dart';
import 'package:medreminder/Reminder/ui/theme.dart';
Widget listTile(Article article, BuildContext context) {
return InkWell(
onTap: (){
Navigator.push(
context, MaterialPageRoute(
builder: (
context) => NewsDetail(
article: article))
);
},
child: Container(
margin: EdgeInsets.all(12),
padding: EdgeInsets.all(8),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(13),
boxShadow: [BoxShadow(color: Colors.black, blurRadius: 3)]),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
height: 180,
width: double.infinity,
decoration: BoxDecoration(
image: DecorationImage(image: NetworkImage(article.urlToImage!),
fit: BoxFit.cover),
borderRadius: BorderRadius.circular(10),
),
),
SizedBox(height: 9),
Container(
padding: EdgeInsets.all(6),
decoration: BoxDecoration(
color: lightblueColor,
borderRadius: BorderRadius.circular(20),
),
child: Text(article.source!.name!, style: TextStyle(color: Get.isDarkMode?Colors.white:Colors.black),),
),
SizedBox(
height: 8,
),
Text(
article.title!,
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
),
)
],
),
),
);
}
let me know if you guys needs to see more of my codes if necessary. thankyou guys
5
Answers
Try This
itemBuilder: (context, index) => listTile(articles[index],context)
your listTile widget needs buildContext also change your code to this
Your
listTile
takes two positional argument. 1st one article and the next one is BuildContextYou can do
But I will prefer switching the position and make the context at first. For more prefer required named argument.
You can use like below
Okay, since you are new in flutter, I should first give you an advice and then answer your question.
Advice
If you starting with flutter without any previous programming experience, You should let things take time, and first start with programming basics then move to flutter.
Now about Your Question
Describe the problem and the solution
In Programming, We have something called methods or functions,
Functions are block of lines code, but separated from main program.
and in your code above,
Here, ListTile is simply a function, and
called function arguments, these arguments need to be passed from out side from where we call out function, in your code you call it here :
But, what you missed that, when you create your function you create it and make it taking 2 arguments, first one is "Article", and the second is context,
and when you call it, you forget to pass context to it, so that error shown to you says "2 positional argument(s) expected, but 1 found. "
Final Answer
after adding the missing parameter to function, it will be like this and the error will solved: