繁体   English   中英

Flutter 最佳实践在屏幕之间共享数据

[英]Flutter best practices share data between screen

我是 flutter 的新手,我阅读了很多关于多个 subjets 的文档。 其中之一是在屏幕之间共享数据。 我找到了很多解决方案,当我正在创建一个具有很多功能的基础项目时,我想知道哪个是最好的

解决方案1:在构造函数中

基本上,当我们导航时,我们通过下一个构造函数小部件发送数据。

解决方案 2:在 session

创建一个 singleton 可以从应用程序中的任何地方访问,每次需要发送数据时,将其添加到 session 中,下一个小部件可以检索它。

解决方案3:在集团

我读了这个看起来不错的解决方案:

我制作了一个 BLoC 容器 class ,在其中实例化了两个屏幕的 BLoC。 然后在这里我将 BLoC A 的引用设置为我想要发送数据的 BLoC B 的 stream。 BLoC 仍然是解耦的,因为它们彼此一无所知,BLoC A 不会通过 BLoC B 上的构造函数传递,反之亦然,但它只知道它将在其流之一上接收一些数据.

更新:

解决方案 4:继承的小部件

与 static function 一样:

static InheritedDataProvider of(BuildContext context) => context.inheritFromWidgetOfExactType(InheritedDataProvider);
}

因此,您可以通过以下方式访问在父级中初始化的数据: final data = InheritedDataProvider.of(context).data;

也许还有其他解决方案,我很高兴知道它们。 谢谢

我用什么:

  1. 使用Navigator.pushNamed(ctx, '/foo', arguments: bar)调用下一个屏幕。 如果需要,仅包括arguments (例如“更新详细信息”屏幕)。
  2. 在包含MaterialApp的小部件中集中所有可能的路由。
  3. 将传递的参数的副本传递到下一个屏幕(不可变数据)。

在代码中:

  ...
  MaterialApp(
    onGenerateRoute: (s) => MaterialPageRoute(builder: (ctx) => _route(s), settings: s),
  )
  ...

  Widget _route(RouteSettings route) {
    switch (route.name) {
      case '/signup':
        return SignupRoute();
      case '/vendor':
        return VendorRoute((route.arguments as Vendor)?.data?.clone());
      default:
        throw ('No match for ${route.name}');
    }
  }

最好的方法是将参数传递给构造函数

Navigator.push(
                context,
                PageTransition(
                    type: PageTransitionType.fade,
                    child: LoginPage(
                      userModel: model,
                    )));

然后:

class LoginPage extends StatefulWidget {
  LoginPage({this.userModel});
  User userModel;
  @override
  _LoginPageState createState() => _LoginPageState(userModel: userModel);
  }  

 class _LoginPageState extends State with TickerProviderStateMixin {
  User userModel;
  _LoginPageState({this.userModel}); 

   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM