You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter笔记应用启动时出现白色Scaffold或加载界面闪烁问题

Flutter笔记应用启动时出现白色Scaffold或加载界面闪烁问题

我太懂这种糟心的体验了——启动Flutter笔记应用时,主题没法立刻生效,得等从SharedPreferences里加载完主题偏好设置,才会切换到正确的主题。这空档期里,App会先渲染默认的白色Scaffold,然后猛地切到目标主题,那种闪烁感真的很影响用户体验。

问题根源

本质上是因为我们在渲染主Widget之后才去异步加载主题偏好,导致App启动时只能先用默认主题占位,等加载完成后再更新状态切换主题,这就出现了明显的闪烁。

解决思路

要解决这个问题,核心就是让主题状态尽可能早地初始化,最好是在主Widget开始渲染之前就完成主题偏好的加载;另外也可以配合启动过渡页,避免用户看到突兀的白色闪屏。

具体实现方案

我们直接修改main()函数,把主题偏好的加载逻辑放在App启动渲染之前完成,这样App一启动就能用上正确的主题:

// main.dart
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'screens/home_screen.dart';

void main() async {
  // 确保Flutter绑定初始化完成
  WidgetsFlutterBinding.ensureInitialized();
  
  // 提前加载主题偏好
  final prefs = await SharedPreferences.getInstance();
  final isDarkMode = prefs.getBool('is_dark_mode') ?? false;

  runApp(MyApp(isDarkMode: isDarkMode));
}

class MyApp extends StatelessWidget {
  final bool isDarkMode;

  const MyApp({super.key, required this.isDarkMode});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '笔记应用',
      theme: isDarkMode ? ThemeData.dark() : ThemeData.light(),
      home: const HomeScreen(),
    );
  }
}

额外优化(可选)

如果加载主题偏好的过程确实需要一点时间,你可以加个简单的启动过渡页,比如显示应用Logo或者加载动画,直到主题加载完成再跳转到主界面:

// 扩展main函数逻辑,配合FutureBuilder实现过渡
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final prefs = await SharedPreferences.getInstance();
  final isDarkMode = prefs.getBool('is_dark_mode') ?? false;

  runApp(MaterialApp(
    home: FutureBuilder(
      future: Future.delayed(const Duration(milliseconds: 300)), // 模拟加载延迟(可选)
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          return MyApp(isDarkMode: isDarkMode);
        } else {
          // 自定义启动过渡界面,比如显示应用图标
          return Scaffold(
            backgroundColor: isDarkMode ? Colors.grey[900] : Colors.white,
            body: const Center(
              child: Icon(Icons.note, size: 60, color: Colors.blueAccent),
            ),
          );
        }
      },
    ),
  ));
}

这样调整之后,App启动时就不会再出现白色Scaffold闪烁的问题,用户体验会顺畅很多。

备注:内容来源于stack exchange,提问作者Alpesh Jasani

火山引擎 最新活动