Flutter如何知道页面/组件可见?

在以前项目中,onPageShow和onPageHide由开源框架flutter_boost提供,在此次项目中,创新性的采用了fusion框架,fusion框架同样提供了类似的方法,但在实践中发现,当flutter页面相互replace或者多次pop页面后,onPageShow不会调用,这就导致了诸多bug,于是,需要探索如何了解一个widget/page是否可见。

首先试验了flutter官方提供的WidgetBindingsObserver,发现其AppLifecycleState有四种状态:

  • resumed 接受用户响应并在前台
  • inactive 不能接受用户响应,失去焦点
  • paused 不可见,运行在后台
  • detached 应用程序仍然由 Flutter 引擎托管,但已从任何宿主视图中分离

经过测试发现,在用户回到桌面或者锁屏,可以监听到paused事件,但是push到新的flutter页面,或者从其他flutter页面pop到本页面,没有生命周期变化,因此,此方案不可行。

观察发现,flutter的动画,在应用退到后台/push到其他页面等情况,动画时间仍在流逝,但动画绘制会停止(节约性能),这就代表着,flutter引擎是能知道某个widget是否可见的,在flutter中使用动画,通常需要使用with关键字混入SingleTickerProviderStateMixin,那么看来答案,就在此类中了。
查看源码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter中,可以通过使用`Visibility`小部件来隐藏或显示组件。`Visibility`小部件可以控制其子组件是否可见,可以使用`visible`属性来设置是否显示子组件。 以下是一个简单的例子,展示如何在切换页面后隐藏一个组件: ```dart import 'package:flutter/material.dart'; class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { bool _showText = true; void _toggleVisibility() { setState(() { _showText = !_showText; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Visibility( visible: _showText, child: Text( 'Hello World!', style: Theme.of(context).textTheme.headline4, ), ), RaisedButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (BuildContext context) => SecondPage())); }, child: Text('Go to Second Page'), ) ], ), ), floatingActionButton: FloatingActionButton( onPressed: _toggleVisibility, tooltip: 'Toggle Visibility', child: Icon(Icons.visibility), ), ); } } class SecondPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Second Page'), ), body: Center( child: RaisedButton( onPressed: () { Navigator.pop(context); }, child: Text('Go back to Home Page'), ), ), ); } } ``` 在这个例子中,我们使用`Visibility`小部件来隐藏或显示文本组件。我们还添加了一个浮动操作按钮来切换文本组件的可见性。当我们切换到第二个页面时,文本组件将被隐藏,当我们返回到主页面时,文本组件将再次显示。 注意,我们在`_toggleVisibility`方法中使用`setState`来通知Flutter框架重新构建小部件树,以更新组件的状态。这是因为`Visibility`小部件的`visible`属性是一个可变状态,需要使用`setState`来更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值