1

我是一个初学者,正在尝试构建一个构造函数来设置列表项,并在滚动到下一页时调用它们以在页面视图中查看。我尝试了太多东西,但都失败了。即使避免直接帮助来提高自己,我还是被困住了,需要帮助。

import 'package:flutter/material.dart';

class Card {
  String image, name;

  Card({this.image, this.name});
}

class CardBrain {
  List<Card> _cardData = [
    Card(image: 'images/item1.jpg', name: 'item1'),
    Card(image: 'images/item2.jpg', name: 'item2'),
  ];

  String getCard() {
    return _cardData[_cardNumber].image;
  }

  String getname() {
    return _cardData[_cardNumber].name;
  }

  int _cardNumber = 0;

  void nextCard(int itemNumber) {
    if (_cardNumber == 0;){
      itemNumber++;
    }

  }
}
 
class Images extends StatefulWidget {
  @override
  _ImagesState createState() => _ImagesState();
}

class _ImagesState extends State<Images> {
  PageController pageController = PageController();

  @override
  Widget build(BuildContext context) {
    return Container(
      child: PageView(
        onPageChanged: cardBrain.nextStory(1),
        controller: pageController,
        children: <Widget>[
          Container(
            color: Colors.white,
            child: Column(
              children: <Widget>[
                Image.asset(cardBrain.getCard(), fit: BoxFit.fitWidth),
                Text(cardBrain.getname(), ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

在此处输入图像描述

4

1 回答 1

0

首先,您应该final确保公共成员变量不会被任意更改。另外,尽量使用const构造函数:

class Card {
  final String image;
  final String name;

  const Card({
    this.image, 
    this.name
  });
}

考虑覆盖toString()这对调试也很有用。使用 getter 而不是getX()因为我们不在 Java 中(或任何其他没有属性的语言)。它看起来更好:

class CardBrain {  
  var _cardData = <Card>[
    Card(image: 'images/item1.jpg', name: 'item1'),
    Card(image: 'images/item2.jpg', name: 'item2'),
  ];

  var _cardNumber = 0;

  String get card => _cardData[_cardNumber].image;
  String get name => _cardData[_cardNumber].name;   

  void nextCard(int itemNumber) {
    if (_cardNumber == 0){
      itemNumber++;
    }
  }
}

我更喜欢使用varandfinal来自动推断类型,但这不是必需的。请参阅文档。您在小部件中也有一些问题:

onPageChanged: cardBrain.nextStory(1), // NO
onPageChanged: (index) => cardBrain.nextStory(1), // OK

请注意,onPageChanged需要传递一个函数,以便您可以使用匿名函数(就像我在上面所做的那样)。index是一个整数。使用 getter,语法也会发生变化:

children: <Widget>[
  Image.asset(cardBrain.card, 
    fit: BoxFit.fitWidth
  ),
  Text(cardBrain.name),
],

您的代码没有显示什么nextStory(int),我们也不知道在哪里cardBrain声明了。你可以像这样初始化它们:

class _ImagesState extends State<Images> {
  final cardBrain = CardBrain();
  final pageController = PageController();

  // other code...
}
于 2020-06-21T12:26:19.190 回答