Dart/Flutter 尝试从另一个小部件更改小部件的变量

Dart/Flutter Trying to change variable of widget from another widget

我有一个 Die StatefulWidget,并且在 _DieState.

中有一个滚动函数
class Die extends StatefulWidget {
  @override
  _DieState createState() => _DieState();
}

class _DieState extends State<Die> {

  Random rand = Random();
  double size;
  bool hold = false;
  int num;

  @override
  Widget build(BuildContext context) {

    void roll() {
      setState(() {
        if (!hold) {
          num = rand.nextInt(6) + 1;
        }
      });
    }

    size = min(MediaQuery.of(context).size.width * 0.15, MediaQuery.of(context).size.height * 0.15);

    return /**boring visual stuff here*/;
  }
}

在我的 Home StatefulWidget 上,我有一个用 GestureDetector 和 5 个 Die 小部件包裹的“滚动”按钮。我无法弄清楚要在 onTap 中放入什么,以便 GestureDetector 在每个 _DieState.

中调用 roll() 方法
class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  @override
  Widget build(BuildContext context) {
    List<Die> dice = [Die(),Die(),Die(),Die(),Die()];
    return Scaffold(
      body: Column(
        children: [
          Row(
            children: dice,
          ),
          GestureDetector(
            onTap: () {/**somehow call roll() for each Die*/},
          ),
        ],
      ),
    );
  }
}

如有任何帮助,我们将不胜感激。谢谢。

试试这个,使用全局密钥来做那个

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

void main(){
  runApp(MaterialApp(home:Home()));
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  final GlobalKey<DieState> _callRollKey0 = GlobalKey<DieState>();
  final GlobalKey<DieState> _callRollKey1 = GlobalKey<DieState>();
  final GlobalKey<DieState> _callRollKey2 = GlobalKey<DieState>();
  final GlobalKey<DieState> _callRollKey3 = GlobalKey<DieState>();
  final GlobalKey<DieState> _callRollKey4 = GlobalKey<DieState>();
  @override
  Widget build(BuildContext context) {
    List<Die> dice = [Die(key: _callRollKey0,), Die(key: _callRollKey1), Die(key: _callRollKey2), Die(key: _callRollKey3), Die(key: _callRollKey4)];
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: dice,
          ),
          GestureDetector(
            child: Container(
              margin: EdgeInsets.all(20),
              height: 50,
              width: 50,
              color: Colors.red,
              child: Center(child: Text('tap')),
            ),
            onTap: () {
              _callRollKey0.currentState.roll();
              _callRollKey1.currentState.roll();
              _callRollKey2.currentState.roll();
              _callRollKey3.currentState.roll();
              _callRollKey4.currentState.roll();

            },
          ),
        ],
      ),
    );
  }

}

class Die extends StatefulWidget {
  Die({Key key}):super(key:key);
  @override
  DieState createState() => DieState();
}

class DieState extends State<Die> {

  Random rand = Random();
  double size;
  bool hold = false;
  int num= 1;

  void roll() {
    setState(() {
      if (!hold) {
        num = rand.nextInt(6) + 1;
      }
    });
  }
  @override
  Widget build(BuildContext context) {



    size = min(MediaQuery.of(context).size.width * 0.15, MediaQuery.of(context).size.height * 0.15);

    return Container(
      color: Colors.green,
      width: size,
      height: 50,
      child: Center(
        child:Text(
          '$num',
        ),
      ),
    );
  }
}

希望这对您有所帮助