在 Flutter 中切换时在 CupertinoTabBar 中处理相机预览

Posted

技术标签:

【中文标题】在 Flutter 中切换时在 CupertinoTabBar 中处理相机预览【英文标题】:Disposing Camera preview in CupertinoTabBar when switched in Flutter 【发布时间】:2021-11-03 10:52:59 【问题描述】:

我正在构建一个 QR 码扫描仪应用程序,其中有几个选项卡包含在 CupertinoTabScaffold 中的 CupertinoTabBar 中。我有一个 CupertinoTabController 来处理选项卡之间的切换。其中一个选项卡具有来自 Flutter 的 Camera 插件的 CameraPreview 小部件以及适当的处置机制。但是,每当切换选项卡时,相机流仍然存在,导致手机发热并导致 janky UX。现在我读到 Material 小部件中的 BottomNavigationBar 不会以这种方式持续存在。关于如何使用 CupertinoTabBar 实现相同行为的任何想法?

【问题讨论】:

【参考方案1】:

您可以为每个页面的选项卡使用StatefulWidget,然后尝试监听AppLifecycleState。如果状态为非活动/暂停,则处理控制器。

就我而言,它工作正常。

class Example extends StatefulWidget 
  @override
  ExampleState createState() => ExampleState();



//Implement WidgetsBindingObserver to listen Lifecycle State
class ExampleState extends State<Example> with WidgetsBindingObserver 
  late CameraController _controller;
  ...
  ...

  @override
  void initState() 
    super.initState();

    // Add Listener (Lifecycle State)
    WidgetsBinding.instance!.addObserver(this); 
  
 

  Future<void> _setupController() async 
    //todo setup/init controller
  

  //Implements this method to listen Lifecycle State
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) 
    if (state == AppLifecycleState.resumed) 
      _controller.dispose();
      _setupCameraAndControllerFuture = _setupController();
    
    if (state == AppLifecycleState.inactive) 
      _controller.dispose();
     else if (state == AppLifecycleState.paused) 
      _controller.dispose();
    
  

  @override
  void dispose()  
    // Remove Listener (Lifecycle State)
    WidgetsBinding.instance!.removeObserver(this);

    // dispose controller
    _controller.dispose();
    super.dispose();
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      ...
      ...
    ); 
    

【讨论】:

以上是关于在 Flutter 中切换时在 CupertinoTabBar 中处理相机预览的主要内容,如果未能解决你的问题,请参考以下文章

Cupertino Datepicker 在 Flutter 中无法正确渲染

Flutter 自定义组件实战之Cupertino(iOS)风格的复选框

获取 Flutter Cupertino_icons 依赖错误

Flutter 是不是会在 iOS 中自动显示 Cupertino UI,在 Android 中使用单一代码库显示 Material?

07Flutter--Cupertino

Flutter 自定义组件实战之Cupertino(iOS)风格的复选框