Flutter Android应用Release模式偶现白屏问题求助
Flutter Release构建后启动频繁白屏问题
我的Flutter Android应用在Debug模式下运行完全正常,但配置签名密钥完成Release构建后,启动时大部分情况下显示空白白屏,仅每7-8次安装中有1次能正常运行。我已尝试关闭R8代码混淆与资源压缩、添加Flutter错误监听等方案,均未解决问题,寻求技术支持。
main.dart 代码
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:shutiaotv_app/data/user_manager.dart'; import 'package:shutiaotv_app/presentation/splash_screen/splash_screen.dart'; import 'package:feedback/feedback.dart'; import 'package:upgrader/upgrader.dart'; import 'core/theme/theme_constants.dart'; import 'core/theme/theme_manager.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); runApp( const BetterFeedback( child: MyApp(), ), ); } ThemeManager themeManager = ThemeManager(); class MyApp extends StatefulWidget { const MyApp({super.key}); @override State<MyApp> createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override void initState() { super.initState(); themeManager.addListener(themeListener); UserManager().loadData().then((value) => themeManager.toggleTheme(UserManager().isDark)); SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]); } @override void dispose() { themeManager.removeListener(themeListener); SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeRight, DeviceOrientation.landscapeLeft, DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); super.dispose(); } void themeListener() { if (mounted) { setState(() {}); } } @override Widget build(BuildContext context) { return MaterialApp( title: '泰美影视', debugShowCheckedModeBanner: false, theme: lightTheme, darkTheme: darkTheme, themeMode: themeManager.themeMode, home: UpgradeAlert( showIgnore: false, child: const SplashScreen(), ), ); } }
pubspec.yaml 代码
name: shutiaotv_app description: A new Flutter project. publish_to: 'none' version: 1.0.0+3 environment: sdk: '>=3.3.4 <4.0.0' dependencies: flutter: sdk: flutter cached_network_image: ^3.3.0 flutter_svg: ^2.0.9 flutter_switch: ^0.3.2 pin_code_fields: ^8.0.1 video_player: ^2.4.6 smooth_page_indicator: ^1.0.0+2 country_list_pick: ^1.0.1+5 flutter_rating_bar: ^4.0.0 meilisearch: ^0.15.0 fijkplayer: ^0.11.0 dio: ^5.3.0 expandable: ^5.0.1 shared_preferences: ^2.2.3 email_validator: ^2.1.17 timer_count_down: ^2.2.2 infinite_scroll_pagination: ^4.0.0 shimmer: ^3.0.0 animated_text_kit: ^4.2.2 getwidget: ^4.0.0 expandable_text: ^2.3.0 extended_wrap: ^0.1.5 flutter_animated_icon_button: ^1.1.3 animated_snack_bar: ^0.4.0 duration: ^3.0.13 url_launcher: ^6.2.6 path_provider: ^2.1.2 filesize: ^2.0.1 disk_space_plus: ^0.2.3 feedback: ^3.0.1 page_transition: ^2.1.0 upgrader: ^10.0.1 in_app_review: ^2.0.9 cupertino_icons: ^1.0.6 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^3.0.0 flutter_launcher_icons: ^0.13.1 flutter_native_splash: ^2.3.10 flutter_launcher_icons: android: "launcher_icon" ios: true image_path: "assets/app_icon.png" min_sdk_android: 21 flutter_native_splash: background_image: "assets/splash_background.png" flutter: uses-material-design: true assets: - assets/ - assets/images/ fonts: - family: SF Pro Display fonts: - asset: assets/fonts/Noto_Sans_SC/NotoSansSC-Regular.ttf weight: 400 - asset: assets/fonts/Noto_Sans_SC/NotoSansSC-Medium.ttf weight: 600 - asset: assets/fonts/Noto_Sans_SC/NotoSansSC-Bold.ttf weight: 700
splash_screen.dart 代码
import 'dart:async'; import 'package:flutter/material.dart'; import 'package:shutiaotv_app/core/app_export.dart'; import 'package:shutiaotv_app/data/user_manager.dart'; import 'package:shutiaotv_app/presentation/home.dart'; import 'package:shutiaotv_app/presentation/onboarding_1_vone_screen/onboarding_1_vone_screen.dart'; import 'package:animated_text_kit/animated_text_kit.dart'; class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @override State<SplashScreen> createState() => _SplashScreenState(); } class _SplashScreenState extends State<SplashScreen> { @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { Timer(const Duration(seconds: 3), () { UserManager().loadUser().then((user) { if (user == null) { Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_) => const Onboarding1VoneScreen())); } else { Navigator.of(context).pushAndRemoveUntil(MaterialPageRoute(builder: (_) => const Home()), (route) => false); } }); }); }); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: ColorConstant.splashBackground, body: Stack( children: [ Align( alignment: Alignment.center, child: CommonImageView( imagePath: ImageConstant.tvLogo, fit: BoxFit.contain, width: getHorizontalSize(200.00), ), ), Align( alignment: Alignment.bottomCenter, child: Padding( padding: const EdgeInsets.only(bottom: 48), child: AnimatedTextKit( totalRepeatCount: 1, animatedTexts: [ TypewriterAnimatedText( '泰美影视', speed: const Duration(milliseconds: 300), textStyle: TextStyle( color: Colors.white, fontSize: getFontSize(48), fontFamily: 'SF Pro Display', fontWeight: FontWeight.w500, height: 1.00, ), ), ], ), ), ), ], ), ); } }
运行状态截图
- 正常运行:

- 白屏状态:

项目 build.gradle 代码
allprojects { repositories { google() mavenCentral() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(':app') } tasks.register("clean", Delete) { delete rootProject.buildDir }
app build.gradle 代码
plugins { id "com.android.application" id "kotlin-android" id "dev.flutter.flutter-gradle-plugin" } def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader -> localProperties.load(reader) } } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { compileSdkVersion flutter.compileSdkVersion ndkVersion flutter.ndkVersion compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } sourceSets { main.java.srcDirs += 'src/main/kotlin' } defaultConfig { applicationId "com.wesayforever.taimeitv_vip" minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true } signingConfigs { release { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword keystoreProperties['storePassword'] } } buildTypes { release { signingConfig signingConfigs.release } } namespace 'com.wesayforever.shutiaotv_app' } flutter { source '../..' } dependencies { implementation "androidx.multidex:multidex:2.0.1" }
settings.gradle 代码
pluginManagement { def flutterSdkPath = { def properties = new Properties() file("local.properties").withInputStream { properties.load(it) } def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath } settings.ext.flutterSdkPath = flutterSdkPath() includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") repositories { google() mavenCentral() gradlePluginPortal() } } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version '7.4.2' apply false id "org.jetbrains.kotlin.android" version "1.7.10" apply false } include ":app"
AndroidManifest.xml 代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.google.android.gms.permission.AD_ID"/> <queries> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="mailto" /> </intent> </queries> <application android:label="泰美影视" android:name="${applicationName}" android:icon="@mipmap/launcher_icon"> <activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme" /> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <meta-data android:name="flutterEmbedding" android:value="2" /> <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-3261022732810553~9529490136"/> </application> </manifest>
内容的提问来源于stack exchange,提问作者user3223981
相关产品推荐
相关产品推荐

