Flutter活动流程管理插件activity_flow的使用

Flutter活动流程管理插件activity_flow的使用

VTEX Activity Flow Mobile RUM(Real User Monitoring)适用于Flutter应用,主要针对Android和iOS平台。

特性

该插件与应用结合使用,旨在:

  • 跟踪用户在应用页面之间的导航并发送事件。

使用

导入包

首先,在main.dart文件中导入插件包:

import 'package:activity_flow/activity_flow.dart';

屏幕视图事件

创建屏幕视图观察者实例

创建一个屏幕视图观察者实例,并设置账户名称:

void main() {
  runApp(
    ExampleApp()
  );
}

class ExampleApp extends StatelessWidget {
  final accountName = 'Account 1';
  final afObserver = PageViewObserver(accountName: accountName);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return TouchDetector( //AF配置
      accountName: accountName,
      child: MaterialApp(
        ...
        navigatorObservers: [afObserver], //AF配置
      ),
    );
  }
}

自动跟踪路由导航

通过将之前创建的AF观察者实例添加到navigatorObservers列表中,可以自动跟踪路由导航:

MaterialApp(
  // 将routeObserver添加到navigatorObservers列表。
  navigatorObservers: [ afObserver ],
  routes: {
    ... // 定义你的命名路由
  },
);

触摸事件

自动跟踪触摸手势

通过将检测器作为Provider添加到应用中,并与页面视图观察者一起使用,可以获取路由名称并自动跟踪触摸手势:

return TouchDetector( //AF配置
  accountName: accountName,
  child: MaterialApp(
    ...
    navigatorObservers: [afObserver], //AF配置
  ),
);

示例代码

以下是完整的示例代码,展示了如何使用activity_flow插件来管理应用的活动流程。

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

import 'package:example/screens/favorite.dart';
import 'package:example/screens/products.dart';
import 'package:example/screens/profile.dart';

void main() {
  runApp(ExampleApp());
}

/// 一个带有自定义主题和路由的MaterialApp。
///
/// 路由在[routes]属性中定义。
/// 主题在[theme]属性中定义。
class ExampleApp extends StatelessWidget {
  ExampleApp({super.key});

  final accountName = 'Account 1';

  final afObserver = PageViewObserver(accountName: accountName);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return TouchDetector( //AF配置
      accountName: accountName,
      child: MaterialApp(
        title: 'Example App',
        theme: ThemeData(
          colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
          useMaterial3: true,
        ),
        routes: {
          '/': (context) => const MyHomePage(),
          '/products': (context) => const ProductsScreen(),
          '/profile': (context) => const ProfileScreen(),
          '/favorites': (context) => const FavoriteScreen(),
        },
        initialRoute: '/',
        navigatorObservers: [afObserver], //AF配置
      ),
    );
  }
}

/// 一个带有按钮以导航到其他屏幕的主页。
class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  final List<Map<String, dynamic>> _routes = const [
    {
      'name': 'Products',
      'route': '/products',
    },
    {
      'name': 'Profile',
      'route': '/profile',
    }
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: const Text('Home Screen'),
      ),
      body: Center(
          child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [
        ..._routes.map((route) => ButtonTemplate(
              title: route['name'],
              route: route['route'],
            )),
      ])),
    );
  }
}

/// 用于创建按钮的模板。
///
/// 接收[title]、[icon]和[route]参数进行导航。
/// 返回一个具有给定参数的[ElevatedButton.icon]。
class ButtonTemplate extends StatelessWidget {
  const ButtonTemplate({
    super.key,
    required this.title,
    required this.route,
  });

  final String title;
  final String route;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () => Navigator.pushNamed(context, route),
      child: Text(title),
    );
  }
}

更多关于Flutter活动流程管理插件activity_flow的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter活动流程管理插件activity_flow的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


activity_flow 是一个用于管理 Flutter 应用中的活动流程的插件。它可以帮助开发者更好地组织和管理应用中的页面跳转、状态管理以及生命周期等。以下是如何使用 activity_flow 插件的基本步骤和示例。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 activity_flow 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  activity_flow: ^最新版本号

然后运行 flutter pub get 来获取依赖。

2. 创建活动流程管理器

activity_flow 的核心是 ActivityFlowManager,它负责管理应用中的活动流程。你可以通过在应用的顶层使用 ActivityFlowManager 来管理所有的页面和状态。

import 'package:activity_flow/activity_flow.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ActivityFlowManager(
        initialActivity: HomeActivity(),
      ),
    );
  }
}

3. 定义活动

activity_flow 中,每个页面或功能模块都被定义为一个 Activity。每个 Activity 是一个 StatefulWidget,并且需要实现 Activity 接口。

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

class HomeActivity extends StatefulWidget implements Activity {
  [@override](/user/override)
  _HomeActivityState createState() => _HomeActivityState();
}

class _HomeActivityState extends State<HomeActivity> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 跳转到另一个Activity
            ActivityFlowManager.of(context).push(SecondActivity());
          },
          child: Text('Go to Second Activity'),
        ),
      ),
    );
  }
}

class SecondActivity extends StatefulWidget implements Activity {
  [@override](/user/override)
  _SecondActivityState createState() => _SecondActivityState();
}

class _SecondActivityState extends State<SecondActivity> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Activity'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 返回到上一个Activity
            ActivityFlowManager.of(context).pop();
          },
          child: Text('Back to Home'),
        ),
      ),
    );
  }
}

4. 管理活动流程

ActivityFlowManager 提供了多种方法来管理活动流程,例如 pushpopreplace 等。

  • push(Activity activity):将一个新的活动压入栈中。
  • pop():从栈中弹出当前活动,返回到上一个活动。
  • replace(Activity activity):用一个新的活动替换当前活动。

5. 处理生命周期

Activity 接口还提供了一些生命周期方法,例如 onCreateonResumeonPause 等,你可以在这些方法中处理活动的生命周期事件。

class HomeActivity extends StatefulWidget implements Activity {
  [@override](/user/override)
  _HomeActivityState createState() => _HomeActivityState();
}

class _HomeActivityState extends State<HomeActivity> {
  [@override](/user/override)
  void onCreate() {
    super.onCreate();
    print('HomeActivity created');
  }

  [@override](/user/override)
  void onResume() {
    super.onResume();
    print('HomeActivity resumed');
  }

  [@override](/user/override)
  void onPause() {
    super.onPause();
    print('HomeActivity paused');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            ActivityFlowManager.of(context).push(SecondActivity());
          },
          child: Text('Go to Second Activity'),
        ),
      ),
    );
  }
}

6. 示例应用

以下是一个完整的示例应用,展示了如何使用 activity_flow 插件管理活动流程:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ActivityFlowManager(
        initialActivity: HomeActivity(),
      ),
    );
  }
}

class HomeActivity extends StatefulWidget implements Activity {
  [@override](/user/override)
  _HomeActivityState createState() => _HomeActivityState();
}

class _HomeActivityState extends State<HomeActivity> {
  [@override](/user/override)
  void onCreate() {
    super.onCreate();
    print('HomeActivity created');
  }

  [@override](/user/override)
  void onResume() {
    super.onResume();
    print('HomeActivity resumed');
  }

  [@override](/user/override)
  void onPause() {
    super.onPause();
    print('HomeActivity paused');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            ActivityFlowManager.of(context).push(SecondActivity());
          },
          child: Text('Go to Second Activity'),
        ),
      ),
    );
  }
}

class SecondActivity extends StatefulWidget implements Activity {
  [@override](/user/override)
  _SecondActivityState createState() => _SecondActivityState();
}

class _SecondActivityState extends State<SecondActivity> {
  [@override](/user/override)
  void onCreate() {
    super.onCreate();
    print('SecondActivity created');
  }

  [@override](/user/override)
  void onResume() {
    super.onResume();
    print('SecondActivity resumed');
  }

  [@override](/user/override)
  void onPause() {
    super.onPause();
    print('SecondActivity paused');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Second Activity'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            ActivityFlowManager.of(context).pop();
          },
          child: Text('Back to Home'),
        ),
      ),
    );
  }
}
回到顶部