dart 应为2个位置参数,但找到1个,请尝试添加缺少的

t3psigkw  于 2022-12-30  发布在  其他
关注(0)|答案(5)|浏览(130)

大家好,我新的Flutter,并试图使一个新闻应用程序与API。但我有一个错误,在我的主页类,在

itemBuilder: (context, index) => listTile(articles[index])

(articles[index])中,有一个红色下划线表示“预期有2个位置参数,但找到1个。尝试添加缺失的参数”。在我添加“BuildContext上下文”以在ListTile类中添加InkWell小部件后,发生此错误

Widget listTile(Article article, BuildContext context) {
  return InkWell(
    onTap: (){
      Navigator.push(
        context, MaterialPageRoute(
          builder: (
            context) => NewsDetail(
              article: article))
      );
    },

这是我完整的主页类代码

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

这是我的ListTile类

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

让我知道如果你们需要看到更多的我的代码,如果有必要。谢谢你们

cld4siwp

cld4siwp1#

listTile有两个位置参数。第一篇文章和下一篇文章是BuildContext

Widget listTile(Article article, BuildContext context) {

你能做到

itemBuilder: (context, index) => listTile(articles[index], context)

但是我更喜欢转换位置,先创建上下文。更多的时候,我更喜欢必需的命名参数。

7qhs6swi

7qhs6swi2#

试试这个

项目生成器:(上下文,索引)=〉listTile(文章[索引],上下文)

kqqjbcuj

kqqjbcuj3#

listTile小部件需要buildContext也将代码更改为

itemBuilder: (context, index) => listTile(articles[index],context)
3mpgtkmj

3mpgtkmj4#

您可以使用如下

itemBuilder: (BuildContext  context, int index) => listTile(articles[index], context)
eqqqjvef

eqqqjvef5#

好吧,既然你是扑动新手,那我先给予你个建议,然后再回答你的问题。

建议

如果你没有任何编程经验就开始学习flutter,那么你应该花点时间,先学习编程基础知识,然后再学习flutter。
关于您的问题

描述问题和解决方案

在程序设计中,我们有方法或函数。函数是一行代码块,但与主程序分离。
在上面的代码中

Widget listTile(Article article, BuildContext context) {
 /// body
 }

在这里,ListTile只是一个函数,

(Article article, BuildContext context)

调用函数参数,这些参数需要从我们调用函数的地方传递,在代码中,请在此处调用:

itemBuilder: (context, index) => listTile(articles[index])

但是,你错过了什么,当你创建你的函数你创建它,并使它采取2个参数,第一个是“文章”,第二个是上下文,
当你调用它的时候,你忘记了传递上下文给它,所以显示给你的错误是“期望2个位置参数,但是找到1个“。

最终答案

将缺少的参数添加到函数后,将如下所示,错误将得到解决:

itemBuilder: (context, index) => listTile(articles[index])

相关问题