簡體   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