Создание конструктора для вызова элементов из списка при прокрутке на другую страницу при просмотре страницы, Flutter - PullRequest
1 голос
/ 21 июня 2020

Я новичок и пытаюсь создать конструктор, который устанавливает элементы списка, а метод получения вызывает их для просмотра в режиме просмотра страницы при прокрутке к следующей странице. Я слишком много пробовал, но потерпел неудачу. Несмотря на то, что я избегаю прямой помощи, чтобы улучшить себя, я застрял и мне нужна помощь.

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(), ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

введите здесь описание изображения

1 Ответ

0 голосов
/ 21 июня 2020

Прежде всего, вы должны использовать final, чтобы гарантировать, что переменные-члены publi c не будут изменены произвольно. Вдобавок постарайтесь максимально использовать конструкторы const:

class Card {
  final String image;
  final String name;

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

Рассмотрите возможность переопределения toString(), что также может быть полезно для отладки. Используйте геттеры вместо 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++;
    }
  }
}

Я предпочитаю использовать var и final для автоматического определения типа, но это не обязательно. См. do c. У вас также есть некоторые проблемы с виджетом:

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

Обратите внимание, что onPageChanged требует передачи функции, поэтому вы можете использовать анонимную функцию (как я сделал выше). index - целое число. При использовании геттеров синтаксис также изменяется:

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...
}
...