首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在应用程序初始化时一起执行期货是一种好的做法,还是应该一次执行一个?

在应用程序初始化时一起执行期货是一种好的做法,还是应该一次执行一个?
EN

Stack Overflow用户
提问于 2021-04-28 22:43:34
回答 1查看 86关注 0票数 2

这可能是一个新手问题。

假设我有一段Flutter代码,在开始调用runApp之前有一些事情需要初始化。考虑下面的代码:

代码语言:javascript
运行
复制
void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  /// Handles localizations
  final flutterI18nDelegate = FlutterI18nDelegate(
      translationLoader: FileTranslationLoader(
          fallbackFile: 'en_US',
          basePath: 'assets/i18n',
          forcedLocale: Locale('en_US'),
          decodeStrategies: [JsonDecodeStrategy()]));

  /// Handles AppsFlyer Integrations
  final AppsFlyerOptions appsFlyerOptions = AppsFlyerOptions(
    afDevKey: 'MY-KEY',
    appId: 'APP-ID',
    showDebug: true,
  );

  final appsFlyerSdk = AppsflyerSdk(appsFlyerOptions);

  /// Starts the Repository
  final repository = Repository();

  /// Initialize Mobile Ads
  final mobileAds = MobileAds.instance.initialize().then((InitializationStatus status) =>
      print('Mobile Ads Initialized! Status: ${status.adapterStatuses}'));

  final List<Future<dynamic>> initFutures = [
    /// Load Localizations
    flutterI18nDelegate.load(null),

    /// Initialize Firebase
    Firebase.initializeApp(),

    /// Initialize Repository
    repository.initialize(),

    /// Initialize AppsFlyer SDK
    appsFlyerSdk.initSdk(),

    /// Initialize Ads
    mobileAds,

    /// Initialize adaptiveMode (Dark, Light, System)
    AdaptiveTheme.getThemeMode()
  ];

  /// Run everything together to save time
  final initResults = await Future.wait(initFutures);
  final FlutterI18n flutterI18n = initResults.first;
  final AdaptiveThemeMode themeSetting = initResults.last ?? AdaptiveThemeMode.system;

  
  runApp(
    RestartWidget(
      child: MultiRepositoryProvider(
          providers: [
             /// ---- ALL Repository Needs ----
          ],
          child: MultiBlocProvider(
              providers: [
                  /// ---- ALL Bloc ----

              ],
              child: MyApp(
                flutterI18nDelegate: flutterI18nDelegate,
                themeSetting: themeSetting,
              ))),
    ),
  );
}

请注意,调用的期货都不是相互依赖的。

但是,在应用程序的开始运行像这样的期货是一种好的做法吗?

当然,一起执行期货的目的是为了节省时间。

或者这样做更好:

代码语言:javascript
运行
复制
/// Copying the futures part only 

  /// Load Localizations
  final FlutterI18n flutterI18n = await flutterI18nDelegate.load(null);

  /// Initialize Firebase
  await Firebase.initializeApp();

  /// Initialize Repository
  await repository.initialize();

  /// Initialize AppsFlyer SDK
  await appsFlyerSdk.initSdk();

  /// Initialize Ads
  await MobileAds.instance.initialize().then((InitializationStatus status) =>
      print('Mobile Ads Initialized! Status: ${status.adapterStatuses}'));

  /// Initialize adaptiveMode (Dark, Light, System)
  final AdaptiveThemeMode themeSetting = (await AdaptiveTheme.getThemeMode()) ?? AdaptiveThemeMode.system;

请随时指出我可能遗漏的任何事情,或者可能是这样做的一个问题,或者这一切都是好的?为什么?(例如:内存泄漏问题?)

谢谢

EN

回答 1

Stack Overflow用户

发布于 2021-04-29 02:16:44

乍一看,我建议不要通过这样的调用来阻止应用程序的启动:

代码语言:javascript
运行
复制
final initResults = await Future.wait(initFutures);

用户将不会知道发生了什么,并且只会看到一个空白屏幕,无论完成所有的未来和初始化需要多长时间。

使用FutureBuilder可能是“等待”异步数据到达的最常见方式,但也是在等待时向用户显示某些内容。

I只是answered a question with similar requirements (等待多个依赖的顺序异步数据)。也许这会让你对如何构建你的应用程序启动有一个大致的概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67302440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档