【问题标题】:create widget class for stack in flutter在颤动中为堆栈创建小部件类
【发布时间】:2021-08-25 05:56:38
【问题描述】:

我有一个 5 堆栈在颤振,我想在 ui 中调用类。 我不想在ui中写很多堆栈。

我写了这个但不工作。 谁能知道我该怎么做? . . . . . . . . .

。 . .. . . . . .

.. . . . . .

这是我在 ui 中的代码的一部分:

 Expanded(
            child: GridView(
              padding: EdgeInsets.only(top: 0, bottom: 0, left: 25, right: 25),
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                crossAxisCount: 2,
                crossAxisSpacing: 15,
                mainAxisSpacing: 15,
                childAspectRatio: 2.5,
              ),
              scrollDirection: Axis.vertical,
              children: <Widget>[
                InkWell(
                 child: ImageCard("b.jpg","some",ListOfEpisode),
                ),

这是它的类:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class ImageCard extends StatefulWidget {
  ImageCard(String nameCard, String clickCard, Type imageName);

  get nameCard => null;
  get clickCard => null;
  get imageName => null;

  @override
  _ImageCardState createState() => _ImageCardState(imageName,nameCard,clickCard);
}

class _ImageCardState extends State<ImageCard> {
  _ImageCardState(imageName, nameCard, clickCard);

  String? get imageName => null;
  String? get nameCard => null;
  get clickCard => null;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      child: Stack(children: <Widget>[
        Container(
          height: 300,
          width: 200,
          decoration: BoxDecoration(
              borderRadius: BorderRadius.circular(20),
              image: DecorationImage(
                image: AssetImage(
                  'assets/images/' + imageName!,
                ),
                fit: BoxFit.cover,
              )),
          child: Center(
            child: Text(
              " " + nameCard!,
              textAlign: TextAlign.center,
            ),
          ),
        ),
      ]),
      onTap: () {
        clickCard;
      },
    );
  }
}

我明白了:

【问题讨论】:

    标签: image flutter class dart


    【解决方案1】:

    get nameCard =&gt; null; 表示它将始终返回 null,这就是您收到错误消息的原因。

    如果您想检查空值,请将其设为可空,例如 final String? imageName;

    在使用它时,请确保它不会获得空值,这是通过在末尾添加 bang ! 来承诺的简单方法。但是如果你不确定,你可以提供一个默认值,比如imageName?? "defaultValue"

    小部件

    
    class ImageCard extends StatelessWidget {
      final String? imageName;
      final String? nameCard;
      final Function clickCard;
    
      const ImageCard({
        Key? key,
        this.imageName,
        this.nameCard,
        required this.clickCard,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return InkWell(
          child: Stack(
            children: <Widget>[
              Container(
                height: 300,
                width: 200,
                decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(20),
                    image: DecorationImage(
                      image: AssetImage(
                        'assets/images/${imageName ?? "default image"}',
                      ),
                      fit: BoxFit.cover,
                    )),
                child: Center(
                  child: Text(
                    " ${nameCard ?? "defaultCardname"}",
                    textAlign: TextAlign.center,
                  ),
                ),
              ),
            ],
          ),
          onTap: () {
            clickCard();
          },
        );
      }
    }
    
    

    用例

    GridView(
            padding: EdgeInsets.only(top: 0, bottom: 0, left: 25, right: 25),
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 2,
              crossAxisSpacing: 15,
              mainAxisSpacing: 15,
              childAspectRatio: 2.5,
            ),
            scrollDirection: Axis.vertical,
            children: <Widget>[
              ImageCard(
                clickCard: () {
                  print("item pressed X ");
                },
                imageName: "name",
                nameCard: "cardname",
              ),
              ...List.generate(
                12,
                (index) => ImageCard(
                  clickCard: () {
                    print("item pressed $index ");
                  },
                  imageName: "name  $index",
                  nameCard: "cardname $index",
                ),
              )
            ],
          ),
    
    

    【讨论】:

    • 当我点击图片时。显示一个灰色的矩形背景返回它。怎么删除?
    • 您可以将InkWell 替换为GuesterDetector,或者您可以在inkWell 上使用splashColor:Colors.transparent
    • 我已经在 inkwel 中尝试过,但不起作用,但我仍然拥有它
    • 你加了splashColor and hover property,方便你使用GestureDetector
    • 我用这个 -> InkWell( splashColor: Colors.transparent, child: Stack(....
    【解决方案2】:

    您正在从 getter 返回 null。这就是您收到此错误的原因。我不确定你为什么需要吸气剂。 但是这段代码可以工作

        import 'package:flutter/cupertino.dart';
        import 'package:flutter/material.dart';
    
        class ImageCard extends StatefulWidget {
        String nameCard;
        String clickCard; 
        String imageName;
    
        ImageCard(this.nameCard, this.clickCard, this.imageName);
        
        @override
    
       _ImageCardState createState() => _ImageCardState(imageName,nameCard,clickCard);
    
    }
    
    class _ImageCardState extends State<ImageCard> {
        String nameCard;
        String clickCard; 
        String imageName;
    
        _ImageCardState(this.nameCard, this.clickCard, this.imageName);
    
      @override
      Widget build(BuildContext context) {
        return InkWell(
          child: Stack(children: <Widget>[
            Container(
              height: 300,
              width: 200,
              decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(20),
                  image: DecorationImage(
                    image: AssetImage(
                      'assets/images/' + imageName,
                    ),
                    fit: BoxFit.cover,
                  )),
              child: Center(
                child: Text(
                  " " + nameCard!,
                  textAlign: TextAlign.center,
                ),
              ),
            ),
          ]),
          onTap: () {
            clickCard;
          },
        );
      }
    }
    

    【讨论】:

    • 我收到此错误:错误:无法将参数类型“字符串”分配给参数类型“类型”。)错误:无法分配参数类型“类型”到参数类型“字符串”错误:参数类型“类型”不能分配给参数类型“字符串”。)
    • 我已经编辑过了。错误地写了 Type 而不是 String
    猜你喜欢
    • 2021-09-25
    • 2021-02-21
    • 2018-11-21
    • 2021-09-09
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    相关资源
    最近更新 更多