这可能是一个新手问题。
假设我有一段Flutter代码,在开始调用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;
请随时指出我可能遗漏的任何事情,或者可能是这样做的一个问题,或者这一切都是好的?为什么?(例如:内存泄漏问题?)
谢谢
发布于 2021-04-29 02:16:44
乍一看,我建议不要通过这样的调用来阻止应用程序的启动:
final initResults = await Future.wait(initFutures);
用户将不会知道发生了什么,并且只会看到一个空白屏幕,无论完成所有的未来和初始化需要多长时间。
使用FutureBuilder
可能是“等待”异步数据到达的最常见方式,但也是在等待时向用户显示某些内容。
I只是answered a question with similar requirements (等待多个依赖的顺序异步数据)。也许这会让你对如何构建你的应用程序启动有一个大致的概念。
https://stackoverflow.com/questions/67302440
复制相似问题