Flutter 无法为具有非最终字段的类定义 const 构造函数

Posted

技术标签:

【中文标题】Flutter 无法为具有非最终字段的类定义 const 构造函数【英文标题】:Flutter Can't define a const constructor for a class with non-final fields 【发布时间】:2021-01-11 13:41:10 【问题描述】:

如果我使用它来显示,我需要在我的代码中使用 setState

The method 'setState' isn't defined for the type 'ProductDetailPage'.

我知道问题出在哪里,因为我需要将 statelesswidget 更改为 statefullwidget。但是如果我将无状态小部件更改为有状态小部件,则会出现另一个问题

Can't define a const constructor for a class with non-final fields.

我的代码

part of '../pages.dart';

class ProductDetailPage extends StatefulWidget 
  @override
  _ProductDetailPageState createState() => _ProductDetailPageState();


class _ProductDetailPageState extends State<ProductDetailPage> 

  final Product product;

  const ProductDetailPage(Key key, @required this.product) : super(key: key); //showing error here


  @override
  Widget build(BuildContext context) 

    double stackWidth = MediaQuery.of(context).size.width;
    double stackHeight = MediaQuery.of(context).size.height;

    return Scaffold(
      body: Container(
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              buildCarousel(context),

            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: () 
          //todo: Get.to(CartPage());
        ,
        backgroundColor: kPrimaryColor,
        label: Text(
          'product.addtocart',
          style: Theme.of(context).textTheme.button,
        ).tr(),
      ),
    );
  


  SideInAnimation buildCarousel(BuildContext context) 
    double stackWidth = MediaQuery.of(context).size.width;
    double stackHeight = MediaQuery.of(context).size.height;
    return SideInAnimation(
      1,
      child: Container(
        color: kCardImageBCColor,
        child: Column(
          children: [
            SizedBox(
              height: stackHeight * 0.3,
              child: Image.asset(product.images[0]),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ...List.generate(product.images.length,
                        (index) => buildSmallProductPreview(index, context)),
              ],
            ),
            SizedBox(height: stackHeight * 0.02,)
          ],
        ),

      ),
    );
  

  GestureDetector buildSmallProductPreview(int index, BuildContext context) 
    int selectedImage = 0;
    double stackWidth = MediaQuery.of(context).size.width;
    double stackHeight = MediaQuery.of(context).size.height;
    return GestureDetector(
      onTap: () 
        setState(() 
          selectedImage = index;
        );
      ,
      child: AnimatedContainer(
        duration: Duration(seconds: 1),

        margin: EdgeInsets.only(right: 10),
        height: stackHeight * 0.07,
        width: stackWidth * 0.15,
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.circular(10),
          border: Border.all(
              color: kPrimaryColor.withOpacity(selectedImage == index ? 1 : 0)),
        ),
        child: Image.asset(product.images[index]),
      ),
    );
  

如果使用 statefull 小部件并且不使用 setState 它工作正常,我不知道为什么它会显示错误。但我必须需要 setState 所以我必须继续使用 stateFull 小部件。我需要解决错误xD

【问题讨论】:

您已将小部件构造函数放置在状态中。将构造函数移动到小部件。 const ProductDetailPage(Key key, @required this.product) : super(key: key); 【参考方案1】:

您需要将 final 变量和构造函数放在 ProductDetailPage 类中。 像这样:

class ProductDetailPage extends StatefulWidget 

  final Product product;

  const ProductDetailPage(Key key, @required this.product) : super(key: key);

  @override
  _ProductDetailPageState createState() => _ProductDetailPageState();


class _ProductDetailPageState extends State<ProductDetailPage> 


  @override
  Widget build(BuildContext context) ...

【讨论】:

以上是关于Flutter 无法为具有非最终字段的类定义 const 构造函数的主要内容,如果未能解决你的问题,请参考以下文章

ObjectMapper 无法处理带有遗留枚举(类)的映射对象

MATLAB 中 A = K * B 的类(具有依赖行为的非依赖属性)

Flutter 存储共享首选项中的自定义类列表

为啥gradle无法为flutter插件打开cp_proj重新映射的类缓存

Flutter Provider:如何监听类字段内部的类字段变化?

Flutter Hive getter 没有为“hiveobjectmixin”类型定义