Performance 在应用程序初始化时一起执行futures是一种好的做法,还是应该一次执行一个?
也许这是一个noob问题 假设我有一个flatter代码,在调用Performance 在应用程序初始化时一起执行futures是一种好的做法,还是应该一次执行一个?,performance,flutter,memory-management,future,main,Performance,Flutter,Memory Management,Future,Main,也许这是一个noob问题 假设我有一个flatter代码,在调用runApp之前,它在开始时有一些东西需要初始化。考虑这个代码: void main() async { WidgetsFlutterBinding.ensureInitialized(); /// Handles localizations final flutterI18nDelegate = FlutterI18nDelegate( translationLoader: FileTranslation
runApp
之前,它在开始时有一些东西需要初始化。考虑这个代码:
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,
))),
),
);
}
请随时指出我可能错过的任何东西,或者可能是做这件事的顾虑,或者一切都好?为什么?
(例如:内存泄漏问题?)
谢谢乍一看,我建议不要用这样的电话来阻止应用程序启动:
/// 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;
final initResults = await Future.wait(initFutures);
用户不会知道发生了什么,只会看到一个空白屏幕,不管所有的未来和初始化需要多长时间才能完成
使用FutureBuilder
可能是“等待”异步数据到达的最常见方式,但也可以在等待时向用户显示一些信息
我只是(等待多个相关的顺序异步数据)。也许这会让你大致了解如何构建应用程序启动。好建议!我会的。那么,你认为把所有的东西都放在一个期货清单中并立即执行是一种好的做法,还是我们应该一个接一个地执行它们?为了准确地解释这一点,对问题进行了修改。@Zenko re:我认为,如果您从第二个代码示例的每一行中删除
wait
,从性能角度来看,它们可能是相同的。(您提到每个未来都是独立于其他未来的,顺序并不重要?)从调试和错误处理的角度来看,我认为第二个更容易处理。在.wait
中的期货列表上,任何错误都将导致期货返回该错误。任何其他的都会被丢弃:请看(您提到每个未来都是独立于其他未来的,顺序并不重要?)错误处理透视图是一个很好的透视图,谢谢。但是,如果从每行中删除wait
,那么try catch
块(在main.dart
中)是否会捕获错误?虽然我们在每个方法调用中都有try-catch
块,但是错误消息可能不会显示给用户。或者,我们必须传递构建的上下文,它将是混乱的。async/await
(或缺少它)不应该影响try/catch
块的范围。删除wait
所做的更改是完成顺序,它不再保证与所写的一样。因此,任何异步调用都可能抛出,您必须决定是在本地捕获它,还是在main.dart中处理更高级别的调用。您仍然可以决定何时何地通知用户异常。