【问题标题】:Function from previous screen still calling when pushed to new Screen in Flutter在 Flutter 中推送到新屏幕时,上一个屏幕的功能仍在调用
【发布时间】:2019-12-27 16:48:04
【问题描述】:

我是新来的颤振。我有两个屏幕。我的第一个屏幕是Stateful,它包含一个使用FutureBuilder 开发的列表视图,当我选择一个项目时,我将应用程序推送到一个同样为Stateful 类型的新屏幕。

当我移动到新屏幕时,之前屏幕的功能仍在调用,我不知道为什么会这样。

这就是我所做的:

InkWell(
         onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => QuizDetail(
                            quizID: featuredContests.id,
                          ),
                        ),
                      );
                    },
                    child: Card(...))// InkWell Closed

下一屏

class QuizDetail extends StatefulWidget {

  final int quizID;
  // In the constructor, require a QuizID.
  QuizDetail({Key key, @required this.quizID}) : super(key: key);

  @override
  _QuizDetailState createState() => _QuizDetailState();

}

class _QuizDetailState extends State<QuizDetail> {
  @override
  void initState() {

    super.initState();

    getQuizDetail(quizID: widget.quizID);

  }

它会调用这个函数,但它也会调用上一个屏幕中的函数,该函数用于从“A”网络获取数据,并且 initState 包含一个用于从 API“B”获取数据的函数,但是数据不是从“B”收到的,而是来自“A”,整个过程被驳回。有人可以帮忙吗?

【问题讨论】:

    标签: flutter state stateful


    【解决方案1】:

    如果您在推送新屏幕后不打算返回第一个屏幕,请尝试使用Navigator.pushReplacement() 而不是Navigator.push()

    Navigator.push() 仅将新屏幕推到当前屏幕上方。它不会丢弃下面的屏幕,因此如果您在代码中的某个位置重建小部件树,调用堆栈中的所有屏幕都将被重建。

    Navigator.pushReplacement() 弹出当前最顶部的屏幕并将新屏幕推送到其位置。

    另外,如果您打算返回第一个屏幕,您可以将onTap 方法标记为async 并使用await 强制您的程序等到QuizDetail 屏幕使用@987654330 弹出@。

    更多关于 Flutter 中导航的信息可以在here找到。

    例子-

    onTap: () async{
      await Navigator.push(
        //Rest of the code is same.
      );
    }
    

    【讨论】:

    • 我有这个Widget build(BuildContext context) { return Scaffold( appBar: AppBar( leading: IconButton( icon: Icon( Icons.arrow_back, color: Color(0xff6D6E70), ), onPressed: () async { await Navigator.pop(context); }), actions: &lt;Widget&gt;[... 并等待说Awaits only futures.
    • 如果我没有在答案中说清楚,我深表歉意。您需要在Navigator.push() 之前使用await 而不是Navigator.pop()
    • 另外,您是否尝试过使用Navigator.pushReplacement() 的第一种方法?
    • 是的,我已经尝试过 pushReplacement 并且还在 Navigator.push 之前放置了 await,但不知何故它再次调用,我现在正在尝试 FutureBuilder,但这是一种意外情况。
    猜你喜欢
    • 2021-11-19
    • 2021-05-16
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    相关资源
    最近更新 更多