Flutter 在 Material 应用程序之间切换或重新加载主函数的方法

发布于 2025-01-17 08:02:19 字数 872 浏览 4 评论 0原文

我希望在用户注册流程和应用程序的其余部分之间明确分离关注点。为此,我创建了一个用于注册流程的 MaterialApp 和一个用于主应用程序的 MaterialApp。当用户完成注册后 - 他们应该被定向到主应用程序。像这样的事情:

void main() async {

    // ... init and stuff ... //

    if(isUserAccountExists){
    
        runApp(MultiProvider(
            providers: [
                Provider(create: (context) => DataStorage()),
                ChangeNotifierProvider.value(value: settingsController),
                ChangeNotifierProvider.value(value: oauthProvider),
                ChangeNotifierProvider.value(value: deviceProvider),
                ChangeNotifierProvider.value(value: messenger),
            ],
            child: MainApp(settingsController: settingsController),
        ),);
    
    } else runApp(EnrollApp());
}

我的问题是当用户完成注册后,我无法重新启动应用程序或重新加载 main() 函数。 (由于 runApp 调用之前的初始化步骤,我必须重新启动)。

I would like to have a clear separation of concerns between user enroll flow and the rest of the app. To do that I have created a MaterialApp for Enroll flow and a MaterialApp for the main application. When the user is done signing up - they should be directed to the main app. So something like this:

void main() async {

    // ... init and stuff ... //

    if(isUserAccountExists){
    
        runApp(MultiProvider(
            providers: [
                Provider(create: (context) => DataStorage()),
                ChangeNotifierProvider.value(value: settingsController),
                ChangeNotifierProvider.value(value: oauthProvider),
                ChangeNotifierProvider.value(value: deviceProvider),
                ChangeNotifierProvider.value(value: messenger),
            ],
            child: MainApp(settingsController: settingsController),
        ),);
    
    } else runApp(EnrollApp());
}

My problem is when the user is done signing up, I have no ways to restart the application or reload the main() function. (I must restart due to initialization steps that precede the runApp call).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寄离 2025-01-24 08:02:19

您可以使用 flutter_phoenix 重新启动您的应用程序。

flutter_phoenix 配置:

dependencies:
    flutter_phoenix: "^1.0.0"

import 'package:flutter_phoenix/flutter_phoenix.dart';

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

Phoenix.rebirth(context);

您可以按照以下步骤操作:

  1. 注册后,调用 Phoenix.rebirth(context); 方法重新启动应用程序
  2. 在启动屏幕或主小部件中检查数据库以便用户是否已经注册,然后将用户重定向到您的 ux/view。

You can use flutter_phoenix to restart your application.

flutter_phoenix configuration:

dependencies:
    flutter_phoenix: "^1.0.0"

import 'package:flutter_phoenix/flutter_phoenix.dart';

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

Phoenix.rebirth(context);

You may follow these steps:

  1. After your sign up, call Phoenix.rebirth(context); method to restart the application
  2. In your splash screen or main widget check the database so that the user is already signed up or not then redirect the user to your ux/view.
冷了相思 2025-01-24 08:02:19

您可以在单独的class(小部件)中提取注册逻辑以根据注册状态呈现哪个屏幕。类似这里:

class _SeparationClassState extends State<SeparationClass> {
  bool isUserAccountExists = false;

  @override
  Widget build(BuildContext context) {
    // update isUserAccountExists to trigger rebuild
    return Scaffold(
      body: isUserAccountExists
          ? MultiProvider(
              providers: [
                Provider(create: (context) => DataStorage()),
                ChangeNotifierProvider.value(value: settingsController),
                ChangeNotifierProvider.value(value: oauthProvider),
                ChangeNotifierProvider.value(value: deviceProvider),
                ChangeNotifierProvider.value(value: messenger),
              ],
              child: MainApp(settingsController: settingsController),
            )
          : EnrollApp(),
    );
  }
}

它不需要是statefulwidget,您可以使用提供商BLOC模式来处理注册逻辑并更新状态(和UI)因此。

You can extract your signup logic in separate Class(Widget) to handle which screen to render based on signup status. Something like here:

class _SeparationClassState extends State<SeparationClass> {
  bool isUserAccountExists = false;

  @override
  Widget build(BuildContext context) {
    // update isUserAccountExists to trigger rebuild
    return Scaffold(
      body: isUserAccountExists
          ? MultiProvider(
              providers: [
                Provider(create: (context) => DataStorage()),
                ChangeNotifierProvider.value(value: settingsController),
                ChangeNotifierProvider.value(value: oauthProvider),
                ChangeNotifierProvider.value(value: deviceProvider),
                ChangeNotifierProvider.value(value: messenger),
              ],
              child: MainApp(settingsController: settingsController),
            )
          : EnrollApp(),
    );
  }
}

It doesn't needs to be a StatefulWidget, you can use Provider or Bloc pattern to handle signup logic and update your state (and ui) accordingly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文