У меня большой опыт работы с Javascript, и теперь я хочу начать с Flutter. Так что, возможно, моя проблема в том, что я вижу код как разработчик JS, и решение Flutter будет другим. Но вот моя проблема: Я хочу создать простую карточную игру. Игральная карта — это StatefulWidget:
class GameCard extends StatefulWidget {
int _value;
String _suit;
bool _visible;
String _imagePath;
// void setVisible() {
// How to execute setState here??
// }
GameCard({int value, String suit, bool visible = false}) {
...
this._visible = visible;
this._value = value;
this._suit = suit;
}
@override
_GameCardState createState() => _GameCardState();
}
class _GameCardState extends State<GameCard> {
String getSuit() => widget._suit;
int getValue() => widget._value;
bool isVisible() => widget._visible;
@override
Widget build(BuildContext context) {
...
return ClipRRect(
borderRadius: BorderRadius.circular(10),
child: Container(
width: width,
height: width * 1.5,
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.cover,
image: AssetImage(widget._imagePath),
...
Идея состоит в том, что imagePath в классе состояния должен быть изображением рубашки карты, когда карта не видна. Теперь я хочу иметь функцию setVisible в моем StatefulWidget, которая запускает setState() с последующим обновлением imagePath. После этого imagePath должен быть изображением игральной карты, например, червовым королем. Итак, наконец, я хочу создать экземпляр GameCard в другом месте и изменить изображение с помощью сеттера:
GameCard spadeFour = GameCard(value: 4, suit: 'spade', visible: false),
spadeFour.setVisible(true)
Как мне это сделать? Я читал о Globalkey и других вещах, но это не может быть так сложно, потому что это очень распространенный вариант использования.
Как правило, вам следует избегать создания экземпляра виджета, а затем его изменения с помощью свойств. Это также не нужно, так как вы уже правильно используете параметры для изменения внешнего вида виджета.
Чтобы виджет перерисовывался с другими параметрами, вместо вызова setState внутри этого виджета вызовите его в родительском виджете.
class _YourParentPageState extends State<YourParentPage> {
bool visible = false;
_changeVisibility(bool v) {
setState(() {
visible = v;
});
}
@override
Widget build(BuildContext context) {
return GameCard(value: 4, suit: 'spade', visible: visible);
}
}
Вызов _changeVisibility перерисует вашу GameCard с обновленным параметром visible.
Спасибо. Я думаю, что мое понимание виджетов неверно. Думаю, мне следует попытаться немного лучше понять концепцию Flutter и его виджетов.
И как можно изменить состояние списка GameCards. Например. в карточной игре 52 карты. Я создаю виджеты в цикле, а затем мне нужно 52 переменные для управления состоянием карт? Какова наилучшая практика в таком случае?
Но тогда я не могу получить доступ к методу из экземпляра GameCard: spadeFour.setVisible(true)