如何在Flutter中刷新当前活动的页面

时间:2019-09-18 05:26:27

标签: flutter dart

我有一个全局函数,几乎可以从我的应用程序的所有屏幕调用该函数。我正在传递上下文。我只想知道是否有一种方法可以根据传递给函数的上下文刷新刷新全局函数的页面?

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;
}

  });
}

我的全局功能根据当前恢复应用程序时互联网的可用性将用户重定向到离线主页/主页。我希望它刷新当前活动的屏幕。

谢谢!

9 个答案:

答案 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