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 带导航功能和钥匙的颤振材料PP未重新启动_Flutter_Dart_Navigation_Setstate - Fatal编程技术网

Flutter 带导航功能和钥匙的颤振材料PP未重新启动

Flutter 带导航功能和钥匙的颤振材料PP未重新启动,flutter,dart,navigation,setstate,Flutter,Dart,Navigation,Setstate,测试时,按几次增量按钮以查看应用程序是否重新启动 我正试图在Flitter中“重启”一个玩具应用程序。我使用的是旧的计数器示例,修改后的行为不是预期的 例如,使用此代码: 导入“包装:颤振/材料.省道”; void main(){ runApp(MyApp()); } 类MyApp扩展了StatefulWidget{ @凌驾 _MyAppState createState()=>\u MyAppState(); } 类MyAppState扩展了状态{ 最终GlobalKey _navigator

测试时,按几次增量按钮以查看应用程序是否重新启动

我正试图在Flitter中“重启”一个玩具应用程序。我使用的是旧的
计数器
示例,修改后的行为不是预期的

例如,使用此代码:

导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
最终GlobalKey _navigatorKey=GlobalKey();
UniqueKey _materialKey;
唯一密钥(homeKey);;
@凌驾
void initState(){
super.initState();
_等待并运行();
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
密钥:_materialKey,
导航工作:_导航工作,
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:我的主页(
密钥:_homeKey,
标题:“颤振演示主页”,
),
);
}
Future\u waitiandrun()异步{
打印('开始延迟…请在时间结束前按下按钮');
等待未来。延迟(持续时间(秒:5));
设置状态(){
_materialKey=UniqueKey();
_homeKey=UniqueKey();
});
打印('屏幕是否已重新加载?');
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _计数器=0;
void _incrementCounter(){
设置状态(){
_计数器++;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“您已经按了这么多次按钮:”,
),
正文(
“$”计数器“,
风格:Theme.of(context).textTheme.headline4,
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下时:\ u递增计数器,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
等待并运行
功能应重新启动应用程序,因为我正在将
\u materialKey
\u homeKey
设置为新实例。作为它的一部分,
MyHomePage
小部件也应该重建(因为
值已经更改),但它没有。 我能理解这是因为
\u navigatorKey
正在“保存”
MaterialApp
的状态,但是
我的主页
应该重建,因为它的键已更改

更奇怪的是,如果我删除
\u materialKey
(如下代码所示),就会重建
MyHomePage
小部件

导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
类MyAppState扩展了状态{
最终GlobalKey _navigatorKey=GlobalKey();
UniqueKey _materialKey;
唯一密钥(homeKey);;
@凌驾
void initState(){
super.initState();
_等待并运行();
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
//密钥:_materialKey,
导航工作:_导航工作,
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:我的主页(
密钥:_homeKey,
标题:“颤振演示主页”,
),
);
}
Future\u waitiandrun()异步{
打印('开始延迟…请在时间结束前按下按钮');
等待未来。延迟(持续时间(秒:5));
设置状态(){
_materialKey=UniqueKey();
_homeKey=UniqueKey();
});
打印('屏幕是否已重新加载?');
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _计数器=0;
void _incrementCounter(){
设置状态(){
_计数器++;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
“您已经按了这么多次按钮:”,
),
正文(
“$”计数器“,
风格:Theme.of(context).textTheme.headline4,
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下时:\ u递增计数器,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}

这对我来说毫无意义,为什么会发生这种事?为什么当我设置
\u materialKey
时,
MyHomePage
小部件没有被重建?

这很正常。颤振始终以安全清洁状态为目标,通常不保留任何物品。你可以使用很多方法,所以我认为你应该

您需要将游戏状态保持为应用程序状态,因此我创建了ToysGame(示例)并添加了count属性,您可以使用并更改此属性,使其不受状态更改的影响

首先,将单个提供商实例包装到应用程序页面

  home: Provider(
    create: (context) => ToysGame(),
    child: MyHomePage(
      key: _homeKey,
      title: 'Flutter Demo Home Page',
    ),
  ),
在页面状态中不保持计数后,您应该使用提供程序的toys状态

  Text(
          Provider.of<ToysGame>(context).count.toString(),
          style: Theme.of(context).textTheme.headline4,
        ),
文本(
Provider.of(context.count.toString(),
风格:Theme.of(context).textTheme.headline4,
),
你呢
 void _incrementCounter() {
  Provider.of<ToysGame>(context, listen: false).count++;
   setState(() {});
  }