如何在Flutter中返回并刷新上一页?

时间:2018-04-14 10:43:46

标签: dart flutter

例如:我想从Page2返回Page1并刷新Page1。

3 个答案:

答案 0 :(得分:5)

当您导航回第一页时,您可以触发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,它会继续监听任何更改并代表您进行更新。

答案 1 :(得分:1)

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

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

(在您的第二页):使用此代码返回第一页。

Navigator.pop(context);

答案 2 :(得分:0)

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

我在 Provider 类中创建了这样的字段,例如:

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

它有一个公共设置器来设置值。公共 consume 允许您仅读取一次值(如果存在)(请求 UI 刷新)。在您需要的地方调用 consume(例如在 build 方法中)。

您不需要Provider,您可以使用其他解决方案来传递它。

实施:

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