[英]Flutter best practices share data between screen
我是 flutter 的新手,我閱讀了很多關於多個 subjets 的文檔。 其中之一是在屏幕之間共享數據。 我找到了很多解決方案,當我正在創建一個具有很多功能的基礎項目時,我想知道哪個是最好的
基本上,當我們導航時,我們通過下一個構造函數小部件發送數據。
創建一個 singleton 可以從應用程序中的任何地方訪問,每次需要發送數據時,將其添加到 session 中,下一個小部件可以檢索它。
我讀了這個看起來不錯的解決方案:
我制作了一個 BLoC 容器 class ,在其中實例化了兩個屏幕的 BLoC。 然后在這里我將 BLoC A 的引用設置為我想要發送數據的 BLoC B 的 stream。 BLoC 仍然是解耦的,因為它們彼此一無所知,BLoC A 不會通過 BLoC B 上的構造函數傳遞,反之亦然,但它只知道它將在其流之一上接收一些數據.
更新:
與 static function 一樣:
static InheritedDataProvider of(BuildContext context) => context.inheritFromWidgetOfExactType(InheritedDataProvider);
}
因此,您可以通過以下方式訪問在父級中初始化的數據: final data = InheritedDataProvider.of(context).data;
也許還有其他解決方案,我很高興知道它們。 謝謝
我用什么:
Navigator.pushNamed(ctx, '/foo', arguments: bar)
調用下一個屏幕。 如果需要,僅包括arguments
(例如“更新詳細信息”屏幕)。MaterialApp
的小部件中集中所有可能的路由。在代碼中:
...
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.