Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 具有InheritedWidget的子项中的颤振触发操作_Flutter_Dart_Inherited Widget - Fatal编程技术网

Flutter 具有InheritedWidget的子项中的颤振触发操作

Flutter 具有InheritedWidget的子项中的颤振触发操作,flutter,dart,inherited-widget,Flutter,Dart,Inherited Widget,我在掷骰子MaterialApp。当按下浮动按钮时,我想在孩子们身上触发“掷骰子”。我正在尝试使用InheritedWidget,但我看到的大多数示例似乎都是相反的,它们会从子窗口触发父窗口更改 无状态父对象: class应用程序扩展了无状态小部件{ @凌驾 小部件构建(构建上下文){ 返回材料PP( 家:脚手架( 主体:容器( 儿童:中心( 孩子:排( 儿童:[ 滚扳机( 滚轮:滚轮(), 孩子:死(), ), 滚扳机( 滚轮:滚轮(), 孩子:死(), ), ], ), ), ), 浮动操作

我在掷骰子
MaterialApp
。当按下
浮动按钮
时,我想在孩子们身上触发“掷骰子”。我正在尝试使用InheritedWidget,但我看到的大多数示例似乎都是相反的,它们会从子窗口触发父窗口更改

无状态父对象:

class应用程序扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
主体:容器(
儿童:中心(
孩子:排(
儿童:[
滚扳机(
滚轮:滚轮(),
孩子:死(),
),
滚扳机(
滚轮:滚轮(),
孩子:死(),
),
],
),
),
),
浮动操作按钮:浮动操作按钮(
子:图标(图标。赌场),
已按下:(){
//在每个骰子上触发骰子滚动
},
),
),
);
}
}
}
InheritedWidget

类RollTrigger扩展了InheritedWidget{
RollTrigger({this.roller,this.child});
终辊;
最后一个孩子;
的静态RollTrigger(BuildContext上下文){
返回context.dependonheritedwidgetofexacttype();
}
@凌驾
bool updateShouldNotify(RollTrigger oldWidget)=>true;
}
我正在尝试使用
roll
类触发roll操作:

class压路机{
布尔滚动=假;
空辊(双态模具){
骰子。滚();
}
}
最后是有状态的死亡:

类Die扩展StatefulWidget{
@凌驾
_DieState createState()=>\u DieState();
}
类_DieState扩展状态{
int值=0;
最终随机=新随机();
滚动(){
this.value=1+\u random.nextInt(6-1);
}
_双稳态();
@凌驾
小部件构建(构建上下文){
var roller=RollTrigger.of(上下文).roller;
返回文本(this.value.toString());
}
}
这似乎应该更简单,但我在这里束手无策

编辑:我正在更新,根据建议将滚动条放在最高层。我仍然不确定如何触发底部小部件的重建:

最终滚轴=滚轴();
...
滚扳机(
罗拉:这个罗拉,
孩子:死(),
)
然后我把滚动法放在滚筒上:

class压路机{
int值=0;
最终随机=新随机();
无效卷(){
this.value=1+\u random.nextInt(6-1);
打印(此值);
}
}
滚轮中指定值

class\u DieState扩展状态{
@凌驾
小部件构建(构建上下文){
最终滚轴=滚轴触发器(上下文)。滚轴;
返回文本(roller.value.toString());
}
}
最后,在顶层调用
roll
方法:

floatingActionButton:floatingActionButton(
子:图标(图标。赌场),
已按下:(){
这个。滚轴。滚轴();
},
),
这会更新
滚轮的值,但不会更改该状态的值。。。这就是我要解决的问题。有很多有趣的模式,但我认为我正在努力解决的是基本的实现

这似乎应该更简单,但我在这里束手无策

对。它应该简单得多

您需要利用observer设计模式。在颤振中,可观察到的是
变更通知程序

软件包提供商将提供很大帮助。您创建的所有小部件类都可以是
无状态小部件

import'dart:math';
进口“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
使用ChangeNotifier类Die{
//
//_值可以是null、1、2、3、4、5、6中的一个
//空值表示模具当前正在滚动。
//
int _值=1;
最终随机_Random=Random();
int获取值{
返回此值;
}
Future roll()异步{
如果(此._值==null){
//已经开始了
返回;
}
该值为.\u值=null;
this.notifyListeners();
等待未来。延迟(持续时间(秒:1));
此._值=1+此._随机.nextInt(6);
this.notifyListeners();
}
}
// ---------------------------------------------------------
void main(){
返回runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(最终构建上下文){
返回材料PP(
标题:“模具滚动应用程序”,
主题:主题数据(原始样本:颜色。蓝色),
主页:MyHomePage(),
);
}
}
类MyHomePage扩展了无状态小部件{
@凌驾
小部件构建(最终构建上下文){
回程多供应商(
供应商:[
变更通知提供者(
创建:(最终构建上下文){
回模();
},
),
],
孩子:脚手架(
appBar:appBar(标题:const Text(“掷骰游戏”),
主体:居中(子项:DIESPLAY()),
floatingActionButton:RollFAB(),
),
);
}
}
类diesplay扩展了无状态小部件{
@凌驾
小部件构建(最终构建上下文){
退货消费者(
生成器:(最终构建上下文上下文、最终模具、最终小部件子级){
返回文本((die.value==null)-“滚动”:die.value.toString());
},
);
}
}
类RollFAB扩展了无状态小部件{
@凌驾
小部件构建(最终构建上下文){
返回浮动操作按钮(
已按下:(){
final Die=Provider.of(上下文,listen:false);
骰子。滚();
},
工具提示:“滚动”,
子:const图标(Icons.casino),
);
}
}

这种方法有点不可靠,但会奏效。它目前不起作用的原因是你从来没有打过电话