我有一个掷骰子MaterialApp
。当floatingButton
按下时,我想触发孩子们的“掷骰子”。我正在尝试使用 InheritedWidget,但我见过的大多数示例似乎都相反,触发了子级的父级更改。
无国籍父母:
class DiceApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Container(
child: Center(
child: Row(
children: <Widget>[
RollTrigger(
roller: Roller(),
child: Die(),
),
RollTrigger(
roller: Roller(),
child: Die(),
),
],
),
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.casino),
onPressed: () {
// Trigger the dice roll on each
},
),
),
);
}
}
}
InheritedWidget
: _
class RollTrigger extends InheritedWidget {
RollTrigger({this.roller, this.child});
final roller;
final Widget child;
static RollTrigger of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<RollTrigger>();
}
@override
bool updateShouldNotify(RollTrigger oldWidget) => true;
}
我正在尝试使用一个Roller
类来触发滚动动作:
class Roller {
bool rolling = false;
void roll(_DieState die) {
die.roll();
}
}
最后是 Stateful Die:
class Die extends StatefulWidget {
@override
_DieState createState() => _DieState();
}
class _DieState extends State<Die> {
int value = 0;
final _random = new Random();
roll() {
this.value = 1 + _random.nextInt(6 - 1);
}
_DieState();
@override
Widget build(BuildContext context) {
var roller = RollTrigger.of(context).roller;
return Text(this.value.toString());
}
}
这似乎应该更简单,但我在这里打结了自己。
编辑:我正在根据建议将 Roller 放在顶层进行更新。我仍然不确定如何触发底部小部件的重建:
final Roller roller = Roller();
...
RollTrigger(
roller: this.roller,
child: Die(),
)
然后我把roll方法放到Roller里面:
class Roller {
int value = 0;
final _random = new Random();
void roll() {
this.value = 1 + _random.nextInt(6 - 1);
print(this.value);
}
}
从 中分配值Roller
:
class _DieState extends State<Die> {
@override
Widget build(BuildContext context) {
final roller = RollTrigger.of(context).roller;
return Text(roller.value.toString());
}
}
最后,调用roll
顶层的方法:
floatingActionButton: FloatingActionButton(
child: Icon(Icons.casino),
onPressed: () {
this.roller.roll();
},
),
这会更新Roller
' 的值,但不会更改 _DieState 的值...这是我要解决的问题。那里有很多有趣的模式,但我认为我正在努力解决的是基本实现。