我有一个全局函数,几乎可以从我的应用程序的所有屏幕调用该函数。我正在传递上下文。我只想知道是否有一种方法可以根据传递给函数的上下文刷新刷新全局函数的页面?
appResumedPausedLogic(context,[bool isVisitPage]){
SystemChannels.lifecycle.setMessageHandler((msg)async{
if(msg=='AppLifecycleState.resumed' )
{
print("------------------------------------ App Resumed-----------------------------");
var serverConnected= await checkConnectionToServer();
if(globals.globalCameraOpenedStatus==false)
if(serverConnected!=1){
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => OfflineHomePage()));
}
else{
Navigator.push(context, MaterialPageRoute(builder: (context) => HomePage()));
}
}
if(msg=='AppLifecycleState.paused' ){
if(globals.globalCameraOpenedStatus==false)
locationThreadUpdatedLocation=false;
}
});
}
我的全局功能根据当前恢复应用程序时互联网的可用性将用户重定向到离线主页/主页。我希望它刷新当前活动的屏幕。
谢谢!
答案 0 :(得分:5)
同样的问题困扰了我很长时间,但最后我想出了一个非常简单的答案
Navigator.pop(context); // pop current page
Navigator.pushNamed(context, "Setting"); // push it back in
答案 1 :(得分:3)
尝试(context as Element).reassemble();
reassemble是用于热重载的功能
我也认为最好说出您的目标,并考虑其他解决问题的解决方案,因为我认为这种方法不可靠。
编辑:评论中有一些有用的提示。
答案 2 :(得分:1)
我遇到了这些情况。除了传递上下文外,我所做的只是将页面包装为null
类型的StreamBuilder,并且每当需要刷新页面时,我都会添加一个null
值以便接收器,以便生成器将得到更新。
希望它会有所帮助:)
答案 3 :(得分:1)
简单易用
setState(() {});
答案 4 :(得分:1)
看看提供商。
从本质上讲,您可以将状态更改从应用程序的一部分通知到另一部分,然后重新绘制目标小部件。
特别要看一下ChangeNotifierProvider
提供商旨在做到这一点。
答案 5 :(得分:0)
验证码
return RefreshIndicator(
child: CustomScrollView(
controller: _scrollController,
slivers: <Widget>[
SliverAppBar(
primary: false,
expandedHeight: 75,
backgroundColor: Color(0xFFf4eedd),
floating: true,
actions: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('images/banner.png'),
fit: BoxFit.fill)),
),
],
),
contentView,
],
),
onRefresh: () async {
this._pageLoadController.reset();
await Future.value({});
},
);
答案 6 :(得分:0)
如果您使用调用函数来初始化该屏幕,您只需要再次调用它。此示例对于使用此软件包的即将到来的访问者非常有用:https://pub.dev/packages/stacked
示例:
这是我的屏幕
class MyPropertyScreen extends StatefulWidget {
@override
_MyPropertyScreenState createState() => _MyPropertyScreenState();
}
class _MyPropertyScreenState extends State<MyPropertyScreen> {
@override
Widget build(BuildContext context) {
return ViewModelBuilder<MyPropertyViewModel>.reactive(
viewModelBuilder: () => MyPropertyViewModel(),
onModelReady: (model) => model.initialized(), //Initalized Function
builder: (context, model, child) =>
Scaffold(
body: ListUI(
recallModel: model
)
));
}
}
class ListUI extends StatelessWidget {
MyPropertyViewModel recallModel;
ListUI ({this.recallModel});
pressReload(){
recallModel.initialized(); //Recall the function again
}
}
如果您正在使用 initState() 您可以使用这个示例找到解决方法。
答案 7 :(得分:0)
使用 设置状态(({})); 在您从 api 访问值的代码部分
喜欢这个
if (data["status"]==200){
setState(() {
message= data["message"];
time = data["message"];
});
}
答案 8 :(得分:-1)
我曾经将此解决方法用于可重新加载活动页面的floatActionButton;
bleed breathing ascites spleen Hepato
Yes Yes No Yes No
No Yes No Yes No
No No Yes Yes No