getter 'duration' 没有为 class '_MealItemState' 定义

The getter 'duration' isn't defined for the class '_MealItemState'

我是 flutter 的初学者,我通过在原始文件中添加 createState()admobe 进行了一些更改,但我一直陷入此错误:

lib/widgets/meal_item.dart:179:33: Error: The getter 'duration' isn't defined for the class '_MealItemState'.
 - '_MealItemState' is from 'package:oumwalidmaindishes/widgets/meal_item.dart' ('lib/widgets/meal_item.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'duration'.
                      duration: duration,
                                ^^^^^^^^
lib/widgets/meal_item.dart:180:36: Error: The getter 'preparation' isn't defined for the class '_MealItemState'.
 - '_MealItemState' is from 'package:oumwalidmaindishes/widgets/meal_item.dart' ('lib/widgets/meal_item.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'preparation'.
                      preparation: preparation,
                                   ^^^^^^^^^^^
lib/widgets/meal_item.dart:181:31: Error: The getter 'people' isn't defined for the class '_MealItemState'.
 - '_MealItemState' is from 'package:oumwalidmaindishes/widgets/meal_item.dart' ('lib/widgets/meal_item.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'people'.
                      people: people,
                              ^^^^^^
lib/widgets/meal_item.dart:182:35: Error: The getter 'complexity' isn't defined for the class '_MealItemState'.
 - '_MealItemState' is from 'package:oumwalidmaindishes/widgets/meal_item.dart' ('lib/widgets/meal_item.dart').
Try correcting the name to the name of an existing getter, or defining a getter or field named 'complexity'.
                      complexity: complexity))
                                  ^^^^^^^^^^


FAILURE: Build failed with an exception.

* Where:
Script 'C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 1070

* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command 'C:\src\flutter\bin\flutter.bat'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 17s
Exception: Gradle task assembleDebug failed with exit code 1

当我尝试删除此行时,错误已解决,但出现其他错误:

  @override
  State<MealItem> createState() => _MealItemState();

这是我的完整代码:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:oumwalidmaindishes/models/ad_helper.dart';
import 'package:provider/provider.dart';

import '../providers/favorite.dart';
import './meal_info.dart';
import '../screens/meal_detail_screen.dart';
import '../models/meal.dart';

const int maxFailedLoadAttempts = 3;

class MealItem extends StatefulWidget {
  final String id;
  final String imageUrl;
  final String title;
  final int preparation;
  final int duration;
  final Complexity complexity;
  final int people;

  const MealItem({
    Key? key,
    required this.id,
    required this.imageUrl,
    required this.people,
    required this.title,
    required this.complexity,
    required this.duration,
    required this.preparation,
  }) : super(key: key);

  @override
  State<MealItem> createState() => _MealItemState();
}

class _MealItemState extends State<MealItem> {
  int _interstitialLoadAttempts = 0;
  InterstitialAd? _interstitialAd;

  void _createInterstitialAd() {
    InterstitialAd.load(
      adUnitId: AdHelper.interstitialAdUnitId,
      request: AdRequest(),
      adLoadCallback: InterstitialAdLoadCallback(
        onAdLoaded: (InterstitialAd ad) {
          _interstitialAd = ad;
          _interstitialLoadAttempts = 0;
        },
        onAdFailedToLoad: (LoadAdError error) {
          _interstitialLoadAttempts += 1;
          _interstitialAd = null;
          if (_interstitialLoadAttempts <= maxFailedLoadAttempts) {
            _createInterstitialAd();
          }
        },
      ),
    );
  }

  void _showInterstitialAd() {
    if (_interstitialAd != null) {
      _interstitialAd!.fullScreenContentCallback = FullScreenContentCallback(
        onAdDismissedFullScreenContent: (InterstitialAd ad) {
          ad.dispose();
          _createInterstitialAd();
        },
        onAdFailedToShowFullScreenContent: (InterstitialAd ad, AdError error) {
          ad.dispose();
          _createInterstitialAd();
        },
      );
      _interstitialAd!.show();
    }
  }

  @override
  void initState() {
    super.initState();
    _createInterstitialAd();
  }

  @override
  void dispose() {
    super.dispose();
    _interstitialAd?.dispose();
  }

  void selectMeal(BuildContext context) {
    _showInterstitialAd();
    Navigator.of(context)
        .pushNamed(
      MealDetailScreen.routeName,
      arguments: widget.id,
    )
        .then((result) {
      if (result != null) {
        // removeItem(result);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    final favMeals = Provider.of<Favorite>(context);
    return InkWell(
        onTap: () => selectMeal(context),
        child: Card(
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
          elevation: 10,
          margin: const EdgeInsets.all(15),
          child: Column(
            children: [
              Stack(
                children: [
                  ClipRRect(
                    borderRadius: BorderRadius.circular(20),
                    child: Image.asset(
                      widget.imageUrl,
                      height: 250,
                      width: double.infinity,
                      fit: BoxFit.cover,
                    ),
                  ),
                  Positioned(
                    bottom: 0,
                    left: 0,
                    child: Container(
                      decoration: const BoxDecoration(
                          borderRadius:
                              BorderRadius.only(topRight: Radius.circular(20), bottomLeft: Radius.circular(20)),
                        color: Color(0xfff2f2f2),),
                      width: 300,
                      // color: Colors.black45,
                      padding: const EdgeInsets.symmetric(
                        horizontal: 30,
                        vertical: 5,
                      ),
                      child: Text(
                        widget.title,
                        style: const TextStyle(
                          color: Colors.black87,
                          fontSize: 22,
                        ),
                        softWrap: true,
                        overflow: TextOverflow.fade,
                      ),
                    ),
                  ),
                  Positioned(
                    bottom: 10,
                    right: 5,
                    child: SizedBox(
                      width: 50,
                      height: 50,
                      child: FittedBox(
                        child: FloatingActionButton(
                            heroTag: null,
                            backgroundColor: Colors.white,
                            onPressed: () {
                              favMeals.toggleFavorite(widget.id);
                            },
                            child: favMeals.isMealFavorite(widget.id)
                                ? const Icon(
                                    Icons.favorite_rounded,
                                    color: Colors.pink,
                                  )
                                : const Icon(Icons.favorite_border_rounded)),
                      ),
                    ),
                  )
                ],
              ),
              Padding(
                  padding: const EdgeInsets.all(20.0),
                  child: MealInfo(
                      duration: duration,
                      preparation: preparation,
                      people: people,
                      complexity: complexity))
            ],
          ),
        ));
  }
}

要访问 _MealItemState 中的 duration,您需要使用小部件 属性,因此:

this.widget.duration