Flutter 如何仅在加载颤振数据时显示启动屏幕

Jun*_*won 3 splash-screen dart flutter

当应用程序的启动屏幕显示时,它需要从 FTP 服务器下载文件并处理数据。实现了颤动的启动屏幕

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    return FutureBuilder(
      future: Future.delayed(Duration(seconds: 3)),
      builder: (BuildContext context, AsyncSnapshot snapshot){
        if(snapshot.connectionState == ConnectionState.waiting)
          return SplashUI();    ///Splash Screen
        else
          return MainUI();       ///Main Screen
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,延迟 3 秒后,启动屏幕将显示 3 秒,在此期间从 FTP 下载文件并处理数据。我想保留启动屏幕直到数据处理完成而不是指定的时间。

启动画面


Widget _splashUI(Size size){
    return SafeArea(
      child: Center(
        child: Container(
          width: size.width * 0.5,
          height: size.height * 0.1,
          child: Image(
            fit: BoxFit.fill,
            image: AssetImage('assets/images/elf_logo.png'),
          ),
        ),
      ),
    );
  }

 Widget build(BuildContext context) {

 getFtpFile();
 dataProgress();

 return Platform.isAndroid ?
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: _splashUI(_size),
      ),
    ) :
    CupertinoApp(
      debugShowCheckedModeBanner: false,
      home: CupertinoPageScaffold(
        child: _splashUI(_size),
      ),
    );
 }
Run Code Online (Sandbox Code Playgroud)

我想知道如何在处理数据时保留 SplashScreen,而不是延迟处理 SplashScreen。谢谢。

jon*_*jon 7

flutter_native_splash包正是您所要求的。FlutterNativeSplash.preserve()在您之前拨打电话runApp()以将启动画面保留在屏幕上,然后FlutterNativeSplash.remove();在下载完成时:

import 'package:flutter_native_splash/flutter_native_splash.dart';

void main() {
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
  runApp(const MyApp());
}

// when your download is completed, remove the splash screen:
    FlutterNativeSplash.remove();
Run Code Online (Sandbox Code Playgroud)

全面披露:我维护这个包。


far*_*ruk 6

processing data rather than在处理 SplashScreen时保留 SplashScreen with delayed

为什么不改变延迟呢?

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {

    return FutureBuilder(
      future: _processingData(),
      builder: (BuildContext context, AsyncSnapshot snapshot){
        if(snapshot.connectionState == ConnectionState.waiting)
          return SplashUI();    ///Splash Screen
        else
          return MainUI();       ///Main Screen
      },
    );
  }

  Future<List> _processingData() {
    return Future.wait[
      _getFtpFile(),
      _dataProgress(),
    ];
  }
}
Run Code Online (Sandbox Code Playgroud)