lifecycle icon indicating copy to clipboard operation
lifecycle copied to clipboard

ChildPageLifecycleWrapper

Open chdown opened this issue 9 months ago • 4 comments

viewpager 中第一个page嵌套了viewpager,如果在第一个viewpager未加载完切换到第二个page时,在切换到第一个page会导致子viewpager的生命周期active和visable不执行,辛苦看下,如有需要我后续补充一个简单的demo(。・_・。)ノI’m sorry~

chdown avatar Mar 29 '25 01:03 chdown

尝试了最新的 0.10.0 还有这样的问题

chdown avatar Mar 29 '25 01:03 chdown

可以给个简单的demo,单文件最好,我本地复现看看是什么情况

chenenyu avatar Mar 29 '25 03:03 chenenyu

可以给个简单的demo,单文件最好,我本地复现看看是什么情况

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(
      title: 'Flutter Demo',
      navigatorObservers: [defaultLifecycleObserver],
      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> {
  PageController pageController = PageController();
  PageController pageController1 = PageController();
  bool isShow = false;
  int index = 0;

  @override
  void initState() {
    super.initState();
    Future.delayed(const Duration(seconds: 3), () {
      setState(() {
        isShow = true;
      });
    });
  }

  @override
  void dispose() {
    pageController.dispose();
    pageController1.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: PageViewLifecycleWrapper(
        child: PageView(
          physics: const NeverScrollableScrollPhysics(),
          controller: pageController,
          children: [
            ChildPageLifecycleWrapper(
              index: 0,
              wantKeepAlive: true,
              onLifecycleEvent: (event) {
                debugPrint("======event parent=======:$event");
              },
              child: isShow
                  ? PageViewLifecycleWrapper(
                      child: PageView.builder(
                        controller: pageController1,
                        itemCount: 3,
                        itemBuilder: (BuildContext context, int index) {
                          return ChildPageLifecycleWrapper(
                            index: index,
                            onLifecycleEvent: (event) {
                              debugPrint("======event child $index=======:$event");
                            },
                            child: Container(
                              color: [Colors.grey, Colors.yellow, Colors.green][index],
                            ),
                          );
                        },
                      ),
                    )
                  : const CircularProgressIndicator(),
            ),
            ChildPageLifecycleWrapper(
              index: 1,
              wantKeepAlive: true,
              child: Container(color: Colors.black),
            ),
          ],
        ),
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: index,
        onTap: (value) {
          pageController.jumpToPage(value);
          setState(() => index = value);
        },
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(icon: Icon(Icons.home),label: "home"),
          BottomNavigationBarItem(icon: Icon(Icons.refresh),label: "refresh"),
        ],
      ),
    );
  }
}

I/flutter (19157): ======event parent=======:LifecycleEvent.inactive I/flutter (19157): ======event parent=======:LifecycleEvent.invisible I/flutter (19157): ======event child 0=======:LifecycleEvent.push I/flutter (19157): ======event child 0=======:LifecycleEvent.visible I/flutter (19157): ======event child 0=======:LifecycleEvent.active I/flutter (19157): ======event parent=======:LifecycleEvent.visible I/flutter (19157): ======event parent=======:LifecycleEvent.active

chdown avatar Apr 01 '25 01:04 chdown

可以给个简单的demo,单文件最好,我本地复现看看是什么情况

demo已提供,问题可能主要出现在延迟加载第一个页面的pageview这里,主要日志已打印

具体操作时在第一个界面未加载完成时切换到第二个界面,再切换会第一个页面会出现这个情况

chdown avatar Apr 01 '25 01:04 chdown