Flutter入门——面向Android开发者——Activity和Fragment

188 阅读2分钟

一、Flutter中的Activity和Fragment是什么?

在Android中,Activity代表用户可以做的一件专注的事情。Fragment代表一个行为或用户界面的一部分。Fragment是一种模块化代码、为大屏幕构建复杂用户界面以及帮助扩展应用程序UII的方法。在Flutter中,这两个概念都属于Widget的范畴。

要连接有关于构建Activity和Fragment的UI的更多信息,可以查看文章——Android 开发人员的 Flutter:如何在 Flutter 中设计 Activity UI

Intent部分所述,Flitter中的屏幕由Widget显示 ,因为在Flutter中一切都是小部件。使用Navigator在 不同的Route,跳转到不同的屏幕或页面,或者可能代表哦相同数据的不同状态或渲染。

二、如何监听Android Activity生命周期事件?

在Android中,您可以override Activity中的方法以捕获Activity的生命周期,或在ApplicationActivityLifecycleCallbacks。在Flutter中,您没有这两个概念,但是您可以通过挂接到WidgetsBinding观察者并监听didChangeAppLifecycleState()更改事件来监听生命周期事件。

可观察到的生命周期事件是:

  • detached——该应用程序仍然托管在Flutter引擎上,单与任何host view分离。
  • inactive——应用程序处于非活动状态并且不接收用户输入。
  • paused——应用程序当前对用户不可见,不影响用户输入,并在后台运行。在Android中个相当于onPause()
  • resumed——应用程序可见并相应用户输入。在Android中相当于onPostResumen()

有关这些状态含义的更多详细信息,请参阅 AppLifecycleStatus文档

您可能已经注意到,只有一小部分Activity生命周期事件可用;虽然FlutterActivity确实在内部捕获了几乎所有的Activity生命周期事件并将它们发送到Flutter引擎,但它们大多与你隔离开来。Flutter负责为您启动和停止引擎,在大多数情况下,几乎没有理由需要在Flutter端观察Activity生命周期。如果您需要观察生命周期以获取或释放任何 native资源,您可能无论如何都因该从navite端进行。

一下是如何观察包含Activity的生命周期状态的示例:

import 'package:flutter/widgets.dart';

class LifecycleWatcher extends StatefulWidget {
    const ListcycleWatch({Key? key}) : super(key: key);
    
    @override
    State<LifecycleWatcher> createState() => _LifecycleWatchState();
}

class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver {
    AppLifecycleState? _lastLifecycleState;
    
    @override
    void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
    }
    
    @override
    void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
    }
    
    @override
    void didChangeAppLifecycleState(AppLifecycleState state) {
        setState(() {
            _lastLifecycleState = state;
        });
    }
    
    @override
    Widget build(BuildContext context) {
        if (_lastLifecycleState == null) {
            return const Text(
                'This widget has not observed any lifecycle changes',
                textDirection: TextDirection.ltr,
            );
        }
        return Text(
            'The most recent lifecycle stte this widget observed was: $_lastLifecycleState',
            textDirection: TextDirection.ltr,
        );
    }
}

void main() {
    runApp(const Center(chiild: LifecycleWatcher()));
}