代码之家  ›  专栏  ›  技术社区  ›  David

如何返回并刷新Flatter中的上一页?

  •  38
  • David  · 技术社区  · 6 年前

    我有一个主页,当单击它时,它会通过导航将我带到另一个页面,在中执行一些操作,然后按后退按钮将我带回到主页。但问题是主页无法刷新。

    当我按下后退按钮并刷新主页时,是否有办法重新加载页面?

    5 回复  |  直到 4 年前
        1
  •  64
  •   Shady Aziza    6 年前

    当您像这样导航回第一页时,可以触发API调用 伪代码

    class PageOne extends StatefulWidget {
      @override
      _PageOneState createState() => new _PageOneState();
    }
    
    class _PageOneState extends State<PageOne> {
      _getRequests()async{
    
      }
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          body: new Center(
            child: new RaisedButton(onPressed: ()=>
            Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new PageTwo()),)
            .then((val)=>val?_getRequests():null),
          ),
        ));
      }
    }
    
    class PageTwo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        //somewhere
        Navigator.pop(context,true);
      }
    }
    

    或者,如果API经常更新,则可以使用流,新数据将在 ListView

    例如,使用firebase,我们可以做到这一点

    stream: FirebaseDatabase.instance.reference().child(
          "profiles").onValue
    

    而且,无论何时更改数据库中的某些内容(例如,从编辑配置文件页面),它都会反映在您的配置文件页面上。在这种情况下,这只可能是因为我正在使用 onValue 它将继续侦听任何更改并代表您进行更新。

        2
  •  10
  •   CopsOnRoad    3 年前

    (在第一页):使用此代码导航到第二页。

    Navigator.pushNamed(context, '/page2').then((_) {
      // This block runs when you have returned back to the 1st Page from 2nd.
      setState(() {
        // Call setState to refresh the page.
      });
    });
    

    (在第2页):使用此代码返回到第1页。

    Navigator.pop(context);
    
        3
  •  2
  •   mlatifr    3 年前

    简单地说,我用这个:

    onPressed: () {
              Navigator.pop(context,
                  MaterialPageRoute(builder: (context) => SecondPage()));
            },
    

    关闭当前页面:

    Navigator.pop
    

    导航上一页:

    MaterialPageRoute(builder: (context) => SecondPage())
    

    在FirtsPage中,我在startUpPage上添加以下内容以刷新:

     @override
      void initState() {
        //refresh the page here
        super.initState();
      }
    
        4
  •  1
  •   Suraj Rao Aditya Agrawal    3 年前

    如果您使用的是GetX: 从nextScreen返回时使用结果,如下所示:

    Get.back(result: 'hello');
    

    要重新加载上一页,请使用此功能:

    void _navigateAndRefresh(BuildContext context) async {
        final result = await Get.to(()=>NextScreen());
        if(result != null){
          model.getEMR(''); // call your own function here to refresh screen
        }
      }
    

    调用此函数,而不是直接导航到nextScreen

        5
  •  0
  •   Michał Dobi Dobrzański    3 年前

    为了获得更细粒度、页面无关的解决方案,我提出了这个Android 单个LiveEvent 模仿行为。

    我在内部创建这样的字段 Provider 类,例如:

    SingleLiveEvent<int> currentYearConsumable = SingleLiveEvent<int>();
    

    它有一个公共setter来设置值。平民的 consume 允许您仅读取一次值(如果存在)(请求UI刷新)。呼叫 消费 您需要的地方(如 build 方法)。

    你不需要 供应商 对于它,您可以使用另一个解决方案来传递它。

    实施:

    /// Useful for page to page communication
    /// Mimics Android SingleLiveEvent behaviour
    /// https://stackoverflow.com/questions/51781176/is-singleliveevent-actually-part-of-the-android-architecture-components-library
    class SingleLiveEvent<T> {
      late T _value;
      bool _consumed = true;
    
      set(T val) {
        _value = val;
        _consumed = false;
      }
    
      T? consume() {
        if (_consumed) {
          return null;
        } else {
          _consumed = true;
          return _value;
        }
      }
    }