Нужна помощь в использовании Flutter в Android Studio и рандомизации плиток с определенными свойствами данных

Любая помощь приветствуется, так как я пытался понять это и не могу. Я делаю игру, которая отображает около 20 плиток случайным образом для каждой новой игры. В настоящее время у меня есть виджет "Список" со всеми 20 плитками как виджеты "Плоская кнопка". Затем я рандомизирую их с помощью функции "randomNumGen..shuffle" и отображаю их в случайном порядке внутри "SliverGrid" (с 5 по ширине, что составляет 4 строки). Затем я хочу, чтобы пользователь щелкнул по тому, который он хочет, а затем щелкнул по месту (пустая сетка ниже), в которое он хочет поместить эту плитку (это домашняя база игрока).

Проблема в том, что я не могу понять, как связать определенные "данные" с каждой плиткой. Например..

Tile 1 = 5 energy and 2 people.
Tile 2 = 3 energy and 4 people
Tile 3 = 4 energy and 3 people.... and so on for all 20 tiles.

Как только они становятся случайными, я не могу понять, как "передать" эти данные пользователю, который выбрал эту плитку, чтобы пользователь получил "5 энергии и 2 человека", если они выбрали плитку 1 (которая находится в случайном месте).

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

class TileData {
  int position;
  int energy;
  int people;

  TileData({this.position, this.energy, this.people});
}


// The 'add' below is causing the error "The expression here has a type of void and therefore can not be used"
List<TileData> list=[];
list.add(TileData(
    position:1,
    energy:2,
    people:4
));
list.add(TileData(
    position:2,
    energy:5,
    people:3
));

// The "tileList" below is causing error "Undefined name tileList"
List<FlatButton> buttons = List.generate(tileList.length, (position) {
  TileData data = tileList[position];
  return FlatButton(
      child: Text('${data.position}'),
      onPressed: () {
        print(data.energy);
        print(data.people);
      });
});

1 ответ


Вы можете просто создать класс со своими атрибутами.

 class TileData{
        int position;
        int energy;
        int people;
        TileData({this.position,this.energy,this.people});
    }

Тогда вы можете сделать List<TileData>

List<TileData> list=[];
list.add(TileData(
    position:1,
    energy:2,
    people:4
));
list.add(TileData(
    position:2,
    energy:5,
    people:3
));

Затем рандомизируйте его с помощью функции ниже. Перемешать список (элементы списка) { var random = new Random();

  // Go through all elements.
  for (var i = items.length - 1; i > 0; i--) {

    // Pick a pseudorandom number according to the list length
    var n = random.nextInt(i + 1);

    var temp = items[i];
    items[i] = items[n];
    items[n] = temp;
  }

  return items;
}

Затем вы можете создать список FlatButton с помощью List.generate() где вы можете назначить желаемое задание с точными данными.

List<FlatButton> buttons=List.generate(tileList.length,(position){
    //You can get the data here
    TileData data=tileList[position];
    return FlatButton(
        child:Text('${data.position}'),
        onPressed:(){
            //You can do you task here
            print(data.energy);
            print(data.people);
        }
    );
});
Другие вопросы по тегам