【问题标题】:Flutter: Is it possible to know if you're currently off stage?Flutter:有没有可能知道你现在是否不在舞台上?
【发布时间】:2022-11-10 23:59:44
【问题描述】:

我的应用中有许多页面都包含在 Offstage 小部件中。每个页面都使用提供程序包根据状态更新进行渲染(例如,用户做了一些事情,我们进行网络调用并显示结果)。

由于页面包装在Offstage 小部件中,因此即使不是当前页面,也会调用build() 方法(和后续网络调用)。

build() 方法中是否有办法知道小部件当前是否处于关闭状态(如果是,则跳过任何昂贵的逻辑)?

我假设我可以处理全局状态等,但我想知道是否有与 Offstage 小部件本身相关的内置内容,类似于 mounted

【问题讨论】:

  • 有必要使用Offstage吗?也许没有它有更好的解决方案
  • 这是为了让页面状态保持活跃。我也在看Visibility,但如果你想保持状态,显然它在幕后使用Offstage

标签: flutter


【解决方案1】:

也许它不适用于您,但您可以通过不使用Offstage 来解决它。考虑这个应用程序:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {

  MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool showFirst = true;

  void switchPage() {
    setState(() {
      showFirst = !showFirst;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Center(
                child: Stack(children: [
                  Offstage(offstage: !showFirst,child: A("first", switchPage)),
                  Offstage(offstage: showFirst,child: A("second", switchPage)),
                ]))));
  }
}

class A extends StatelessWidget {
  final String t;
  final Function onTap;
  const A(this.t, this.onTap, {Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    print('$t is building');
    return TextButton(onPressed: ()=> onTap(), child: Text(t));
  }
}

您会通过打印注意到两个页面都已构建。但是如果你在没有Offstage 的情况下像这样重写它,那么只会构建可见的:

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: Center(
                child: Stack(children: [
                  if (showFirst) A("first", switchPage),
                  if (!showFirst)  A("second", switchPage),
                ]))));
  }

【讨论】:

  • 感谢您的建议,但是-如果我错了,请纠正我-这不会使页面状态保持活动状态吗?所以如果每个页面都有子导航,你会失去你的位置等
  • @divillysausages 啊,是的,它可能不会让国家保持活力,不
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2020-06-03
  • 2020-11-24
  • 2016-08-19
  • 1970-01-01
相关资源
最近更新 更多