Flutter重生/恢复状态插件flutter_phoenix的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter重生/恢复状态插件flutter_phoenix的使用

轻松地从头开始重启您的应用程序,从而丢弃任何先前的状态。

Flutter 3.0

从1.1.0版本开始,flutter_phoenix的目标SDK为2.17.0及以上。 如果您想继续使用flutter_phoenix但无法迁移到Dart SDK 2.17.0,请使用版本1.0.0。

Flutter 2.0 和 null-safety

从1.0.0版本开始,flutter_phoenix是null-safe的,并且要求Dart SDK 2.12.0及以上。 如果您想继续使用flutter_phoenix但无法迁移到null-safety,请使用版本0.1.0。

使用方法

将您的App小部件包裹在Phoenix小部件中。

void main() {
  runApp(
    Phoenix(
      child: App(),
    ),
  );
}

当您想要重启应用程序时(重新构建整个小部件树),调用rebirth静态方法。

Phoenix.rebirth(context);

免责声明

Phoenix在应用程序级别重启您的应用程序,重新构建您的应用程序小部件树,从而丢弃任何先前的状态。

Phoenix不会在操作系统级别完全重启您的应用程序进程。

使用场景

以下是Phoenix可以帮忙的一些非详尽列表:

  • 在注销后重启应用程序
  • 在应用程序初始化过程失败后重启应用程序
  • 在应用程序中发生特定事件后重启应用程序

安装

依赖项

在您的pubspec.yaml文件中作为依赖项添加该包。

dependencies:
  flutter_phoenix: "^1.0.0"
导入

在您的代码文件中导入该包。

import 'package:flutter_phoenix/flutter_phoenix.dart';

许可证

Flutter Phoenix 是在 MIT 许可证下发布的。

致谢

此包是从@rrousselGitStack Overflow上的回答中提取出来的。

关于我们

截至2022年7月,该包由法国移动应用Dailyn的前端团队维护。

示例代码

以下是一个完整的示例,展示了如何使用Phoenix插件来重启应用程序。

import 'dart:async';

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

void main() {
  runApp(
    /// 1. 将您的App小部件包裹在Phoenix小部件中
    Phoenix(
      child: App(),
    ),
  );
}

class App extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.light(),
      home: const SplashScreen(),
    );
  }
}

class SplashScreen extends StatefulWidget {
  const SplashScreen();

  [@override](/user/override)
  _SplashScreenState createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  [@override](/user/override)
  void initState() {
    super.initState();

    simulateInitialDataLoading();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: SizedBox(
        width: double.infinity,
        height: double.infinity,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: const [
            Text(
              '初始屏幕',
              style: TextStyle(
                  color: Colors.white,
                  fontSize: 34,
                  fontWeight: FontWeight.w700),
            ),
          ],
        ),
      ),
    );
  }

  Future<Timer> simulateInitialDataLoading() async {
    return Timer(
      const Duration(seconds: 2),
      () => Navigator.push(
        context,
        MaterialPageRoute(
          builder: (context) => const MainScreen(),
        ),
      ),
    );
  }
}

class MainScreen extends StatelessWidget {
  const MainScreen();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          width: double.infinity,
          height: double.infinity,
          padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 48.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const Text(
                'Flutter Phoenix',
                style: TextStyle(fontSize: 34, fontWeight: FontWeight.w700),
              ),
              const SizedBox(height: 24),
              const Text(
                'Phoenix小部件使您可以从头开始重建小部件树,丢弃任何状态。'
                '\n\n它基本上会重新构建您的整个应用程序。'
                '\n\n使用方法非常简单:'
                '\n\n1. 将根App小部件包裹在Phoenix小部件中'
                '\n\n2. 调用Phoenix.rebirth(context); 以重建您的应用程序',
                style: TextStyle(
                    fontSize: 16, fontWeight: FontWeight.w400, height: 1.5),
              ),
              const Spacer(),
              SizedBox(
                width: double.infinity,
                height: 48.0,
                child: TextButton(
                  style: TextButton.styleFrom(
                    backgroundColor: Colors.red,
                    primary: Colors.white,
                  ),
                  child: const Text('Phoenix.rebirth(context);'),

                  /// 2. 调用Phoenix.rebirth(context)以重建您的应用程序
                  onPressed: () => Phoenix.rebirth(context),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter重生/恢复状态插件flutter_phoenix的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter重生/恢复状态插件flutter_phoenix的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,flutter_phoenix 是一个非常有用的插件,用于重生或恢复应用的状态。这在处理应用崩溃后的恢复时尤其有用。以下是如何在Flutter项目中使用 flutter_phoenix 的一个简单示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_phoenix: ^1.0.0  # 请确保使用最新版本

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

2. 使用 flutter_phoenix

接下来,在你的 Flutter 应用中导入 flutter_phoenix 包,并使用它来重生应用的状态。

main.dart

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

void main() {
  runApp(Phoenix(
    child: MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Phoenix Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  void _rebootApp() {
    Phoenix.rebirth(context);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Phoenix Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
      bottomNavigationBar: BottomNavigationBar(
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.refresh),
            label: 'Reboot',
            onPressed: _rebootApp, // This is where we call the reboot function
          ),
        ],
      ),
    );
  }
}

解释

  1. 依赖添加:在 pubspec.yaml 中添加 flutter_phoenix 依赖。
  2. Phoenix 包装:在 main.dart 中,使用 Phoenix 小部件包装你的根小部件 MyApp
  3. 重生应用:在 MyHomePage 中,我们定义了一个 _rebootApp 方法,它调用 Phoenix.rebirth(context) 来重启应用。这里,我们在底部导航栏中添加了一个“Reboot”按钮来触发重启。

当你点击“Reboot”按钮时,应用将会重启,但是状态(如计数器值)将会被重置,因为整个应用被重新构建。这正是 flutter_phoenix 插件的用途:提供一种简单的方法来重启应用,同时保持应用的架构和逻辑相对简单。

注意:在实际应用中,重生应用通常用于处理不可恢复的错误或状态,而不是用于正常的用户交互。

回到顶部