每次视图进入屏幕时如何在抖动中重建整个视图

时间:2020-01-09 11:53:47

标签: flutter

我希望我的页面每当进入页面时总是点击API。 例如,我有2个屏幕,即FirstSCreen和SecondScreen。 在FirstScreen中,我正在调用API来获取一些数据。因此,如果用户从FirstScreen导航到SecondScreen,然后通过按后退按钮返回FirstScreen,则它应再次在FirstScreen中点击API。

我想知道flutter中是否有任何内置函数,应该在其中调用我的方法,以便它每次进入屏幕时都可以工作。我已经尝试过使用 didUpdateWidget(),但是它不能按照我想要的方式工作。

initState()也仅在加载小部件时被调用。 请向我解释

2 个答案:

答案 0 :(得分:3)

您可以使用async await。假设您有一个更改路线的按钮。

onPressed: () async {
  await Navigator.of(context).push(
    MaterialPageRoute(
        builder: (context) => SecondScreen(),
      ),
  );
  ApiCall();
},

仅当用户在第二个屏幕上向后推时,ApiCall函数才会调用。

答案 1 :(得分:1)

我有一个例子可能会有所帮助。但是,它可能无法涵盖您的FirstScreen总是会在调用来自其他页面/屏幕的页面后显示页面或专门恢复应用程序的所有情况(来自后台-请勿混淆)从另一个屏幕弹出或弹出)。

但是,我的示例在您从特定屏幕返回时始终会调用一个函数,您可以将其重新实现为其他导航功能,以确保在返回FirstScreen时始终会调用特定函数在其他屏幕上。

main.dart

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: HomePage(),
    );
  }
}

home_page.dart

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Center(
            child: RaisedButton(
              onPressed: () => Navigator.of(context)
                  .push(MaterialPageRoute(builder: (context) => SecondPage()))
                  .then((value) => _reload(value)),
              child: Text('Navigate to Next Page'),
            ),
          )
        ],
      ),
    );
  }

  Future<void> _reload(var value) async {
    print(
        'Home Page resumed after popping/closing SecondPage with value {$value}. Do something.');
  }
}

second_page.dart

class SecondPage extends StatefulWidget {
  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        Navigator.pop(context, 'Passed Value');

        /// It's important that returned value (boolean) is false,
        /// otherwise, it will pop the navigator stack twice;
        /// since Navigator.pop is already called above ^
        return false;
      },
      child: Scaffold(
        appBar: AppBar(),
        body: Column(
          mainAxisSize: MainAxisSize.max,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Center(child: Text('Second Page')),
          ],
        ),
      ),
    );
  }
}