lifecycle icon indicating copy to clipboard operation
lifecycle copied to clipboard

onVisible和onInvisible没有被调用

Open fulibo opened this issue 1 year ago • 8 comments

当网页随着浏览器退到后台时,插件的生命周期失效了

fulibo avatar Sep 02 '24 08:09 fulibo

方便提供一下简化的widget测试代码吗?

chenenyu avatar Sep 02 '24 12:09 chenenyu

import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [defaultLifecycleObserver],
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text('生命周期测试(Web)'),
      ),
      body: LifecycleWrapper(
        onLifecycleEvent: (LifecycleEvent event) {
          switch(event) {
            case LifecycleEvent.visible:
              debugPrint('页面可见');
              break;

            case LifecycleEvent.invisible:
              debugPrint('页面不可见');
              break;

            default:
              break;
          }
        },
        child: Center(
          child: Text('生命周期测试'),
        ),
      ),
    );
  }
}

运行时添加的参数: -d chrome --web-browser-flag "--disable-web-security" --web-renderer canvaskit --web-hostname=xyz.com

模拟器或真机上访问对应网址,当浏览器退到后台,相应的日志并没有被打印

fulibo avatar Sep 02 '24 14:09 fulibo

好的,我看下,之前没怎么在web平台测试过。

chenenyu avatar Sep 03 '24 08:09 chenenyu

Try 0.9.0

chenenyu avatar Sep 04 '24 11:09 chenenyu

尝试0.9.0

并没有得到解决,我这边是依靠如下方案获得切到后台和切到前台的事件

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

    listen = document.onVisibilityChange.listen((event) {
      if (document.visibilityState == 'hidden') {
        debugPrint('页面变为不可见');
      } else if (document.visibilityState == 'visible') {
        debugPrint('页面变为可见');
      }
    });

    // 初始状态检查
    if (document.visibilityState == 'hidden') {
      debugPrint('页面初始状态为不可见');
    } else if (document.visibilityState == 'visible') {
      debugPrint('页面初始状态为可见');
    }
  }

  @override
  void dispose() {
    listen?.cancel();
    listen = null;

    super.dispose();
  }

fulibo avatar Sep 05 '24 12:09 fulibo

import 'package:flutter/material.dart';
import 'package:lifecycle/lifecycle.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorObservers: [defaultLifecycleObserver],
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text('生命周期测试(Web)'),
      ),
      body: LifecycleWrapper(
        onLifecycleEvent: (LifecycleEvent event) {
          switch(event) {
            case LifecycleEvent.visible:
              debugPrint('页面可见');
              break;

            case LifecycleEvent.invisible:
              debugPrint('页面不可见');
              break;

            default:
              break;
          }
        },
        child: Center(
          child: Text('生命周期测试'),
        ),
      ),
    );
  }
}

运行时添加的参数: -d chrome --web-browser-flag "--disable-web-security" --web-renderer canvaskit --web-hostname=xyz.com

模拟器或真机上访问对应网址,当浏览器退到后台,相应的日志并没有被打印

我用你的demo测试是可以的,回调正常。 image

chenenyu avatar Sep 06 '24 00:09 chenenyu

我用你的demo测试是可以的回调,正常

你那边的测试case也是将浏览器置于后台? 我这边就第一次加载页面打印了可见,后面网页随浏览器退到后台和切回前台就没有其他打印了 image

fulibo avatar Sep 06 '24 01:09 fulibo

可以把所有Event的回调都打印看看

chenenyu avatar Sep 07 '24 13:09 chenenyu