簡體   English   中英

如何將上下文傳遞給我在 Flutter 中映射的 class 中的 function?

[英]How to pass context to a function in a class which I am mapping over in Flutter?

我的應用程序中有幾個小部件,它們通過映射數據來構建“卡片”(ListTiles),如下所示:

return FutureBuilder<List<MyCard>>(
                future: MyCard.readData(snapshot.data),
                builder: (context, cards) {
                  if (cards.hasData) {
                    final card = cards.data!;
                    return Expanded(
                        child: ListView(
                            padding: const EdgeInsets.all(16),
                            children: card.map(MyCard.buildCard).toList()));
                  } else {
                    return const Text("No data");
                  }
                });

buildCard 方法(針對 MyCard 類)如下所示:

static Widget buildCard(MyCard card) {
    var dateFormat = DateFormat('MM/dd/yyyy');
    return Column(
      children: [
        Align(
            alignment: Alignment.centerRight,
            child: Text(dateFormat.format(card.createdOn.toDate()))),
        const SizedBox(height: 6),
        ListTile(
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),
          tileColor: Colors.white,
          leading: CircleAvatar(child: Text(card.subCategory)),
          title: Text("Score: " + card.score + " Misses: " + card.misses),
          subtitle: card.comment.isNotEmpty
              ? Text("Comment(s): " + card.comment)
              : null,
          trailing: IconButton(
              icon: const Icon(Icons.arrow_forward_ios),
              onPressed: checkCard(card)), //need to pass context to checkCard
        ),
        const SizedBox(height: 18),
      ],
    );
  }

但是我需要獲取 buildCard 方法的上下文(因為我需要將它傳遞給 checkCard 方法,因為我試圖在所述方法中調用 showDialog() 而我不知道如何傳遞上下文。

我嘗試簡單地將 BuildContext 字段添加到 buildCard 方法中,如下所示:

static Widget buildCard(MyCard card, BuildContext context) {
    var dateFormat = DateFormat('MM/dd/yyyy');
    return Column(
      children: [
        Align(
            alignment: Alignment.centerRight,
            child: Text(dateFormat.format(card.createdOn.toDate()))),
        const SizedBox(height: 6),
        ListTile(
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)),
          tileColor: Colors.white,
          leading: CircleAvatar(child: Text(card.subCategory)),
          title: Text("Score: " + card.score + " Misses: " + card.misses),
          subtitle: card.comment.isNotEmpty
              ? Text("Comment(s): " + card.comment)
              : null,
          trailing: IconButton(
              icon: const Icon(Icons.arrow_forward_ios),
              onPressed: checkCard(card, context)),
        ),
        const SizedBox(height: 18),
      ],
    );
  }

但是當我嘗試將它傳遞給小部件中的方法時,它似乎不起作用。 我想我會按如下方式傳遞它:

return FutureBuilder<List<MyCard>>(
                future: MyCard.readData(snapshot.data),
                builder: (context, cards) {
                  if (cards.hasData) {
                    final card = cards.data!;
                    return Expanded(
                        child: ListView(
                            padding: const EdgeInsets.all(16),
                            children: card.map(MyCard.buildCard(context)).toList()));
                  }

但是得到以下信息:

錯誤信息

試試下面的代碼:

ListView.builder(
  itemCount: card.length,
  itemBuilder: (context, index) {
    return MyCard.buildCard(card[index], context);
  },
),

更改您的代碼

 ListView(
    padding: const EdgeInsets.all(16),
    children: card.map(MyCard.buildCard(context)).toList()));
    

ListView.builder(
  itemCount: card.length,
  itemBuilder: (context, index) {
    return MyCard.buildCard(card[index], context); 👈 Pass your context here which is received from the itemBuilder
  },
),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM