如何动态地在闪屏中设置持续时间?

问题描述

Flutter初始屏幕显示在主页之前的屏幕上。但是主页上有一些从互联网上获取的数据。初始屏幕的持续时间设置为固定的秒。我很感兴趣,只是想知道是否有一种方法可以使启动屏幕在屏幕上可见,直到所有数据都加载到下一个屏幕上为止。

我的启动画面课程

<?PHP
include_once '../vendor/autoload.PHP';
include_once('../util/db.PHP');
include_once('../util/registrationClassnew.PHP');



$fullNode = new \IEXBase\TronAPI\Provider\HttpProvider('https://api.trongrid.io');
$solidityNode = new \IEXBase\TronAPI\Provider\HttpProvider('https://api.trongrid.io');
$eventServer = new \IEXBase\TronAPI\Provider\HttpProvider('https://api.trongrid.io');

try {
    $tron = new \IEXBase\TronAPI\Tron($fullNode,$solidityNode,$eventServer);
} catch (\IEXBase\TronAPI\Exception\TronException $e) {
    exit($e->getMessage());
}


$tron->setAddress('TFBZGTizGT8XrDKzNFbMuJ7AGvisD2E9u5');
// $tron->setPrivateKey('pvt key');
var_dump($tron->send('TM1tn547Gckov1kKvbFMrnGpSLcwXVYGbR',1.5));

启动画面之后的类

import 'dart:async';
import 'package:Flutter/material.dart';
import 'listview.dart';

class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  @override
  void initState() {
    super.initState();
    Timer(
        Duration(seconds: 5),() => Navigator.of(context).pushReplacement(MaterialPageRoute(
            builder: (BuildContext context) => restlistview())));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,body: DecoratedBox(
        position: decorationPosition.background,decoration: Boxdecoration(
            color: Colors.white,image: decorationImage(
                image: NetworkImage(
                  'https://i.imgur.com/KS9AbXK.png',),fit: BoxFit.cover)),child: Image.network('https://i.imgur.com/o4ZRh9k.png'),);
  }
}

主班

import 'package:Flutter/material.dart';

class restlistview extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = "ListView List";

    List choices = const [
      const Choice(
          title: 'Artisan Coffee',Address: 'Kumarpara,Sylhet',imglink: 'https://i.imgur.com/9TUi7ts.png'),const Choice(
          title: 'Cafe Aarko',Address: 'Barutkhana,imglink: 'https://i.imgur.com/JEfDpIZ.png?1'),const Choice(
          title: 'Cafe La vista',Address: 'Zindabazar,imglink: 'https://i.imgur.com/u4Lvc4k.png'),const Choice(
          title: 'Coffee Club',imglink: 'https://i.imgur.com/gVoh8xO.png'),const Choice(
          title: 'Peepers',imglink: 'https://i.imgur.com/izRo3Tj.png'),const Choice(
          title: 'The Swad Restaurant',imglink: 'https://i.imgur.com/o4ZRh9k.png'),];

    return MaterialApp(
        title: title,home: Scaffold(
            appBar: AppBar(
              title: Image.network(
                'https://i.imgur.com/Z9ETdwa.png',fit: BoxFit.cover,backgroundColor: Color(0xffB01C2A),body: DecoratedBox(
                position: decorationPosition.background,decoration: Boxdecoration(
                    color: Color(0xffFAAF40),image: decorationImage(image: NetworkImage(''))),child: new ListView(
                    shrinkWrap: true,padding: const EdgeInsets.only(top: 10.0),children: List.generate(choices.length,(index) {
                      return Center(
                        child: ChoiceCard(
                            choice: choices[index],item: choices[index]),);
                    })))));
  }
}

class Choice {
  final String title;
  final String Address;
  final String imglink;

  const Choice({this.title,this.Address,this.imglink});
}

class ChoiceCard extends StatelessWidget {
  const ChoiceCard(
      {Key key,this.choice,this.onTap,@required this.item,this.selected: false})
      : super(key: key);

  final Choice choice;

  final VoidCallback onTap;

  final Choice item;

  final bool selected;

  @override
  Widget build(BuildContext context) {
    TextStyle textStyle = Theme.of(context).textTheme.display1;

    if (selected)
      textStyle = textStyle.copyWith(color: Colors.lightGreenAccent[400]);

    return Card(
        elevation: 0.0,color: Color(0xffB01C2A).withOpacity(0.2),child: Row(
          children: [
            new Container(
                color: Colors.transparent,height: 100,width: 100,padding: const EdgeInsets.only(
                    top: 8.0,bottom: 8.0,left: 0.0,right: 8.0),child: Image.network(choice.imglink)),new Container(
              padding: const EdgeInsets.only(
                  top: 30.0,left: 2.0,child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,crossAxisAlignment: CrossAxisAlignment.start,children: [
                  Text(choice.title,style: TextStyle(
                          fontSize: 20,color: Color(0xffB01C2A),fontWeight: FontWeight.bold)),Text(choice.Address,style: TextStyle(
                          color: Colors.black.withOpacity(1.0),],)
          ],));
  }
}

解决方法

是的,可以。逻辑是等待fetchData函数完成,然后导航到另一个屏幕

一种方法

initState(){
 super.initState();
 leaveSplashScreen();
}

Future fetchData()async{
//Fetch your data here.
}

void leaveSplashScreen() async{
  await fetchData();
  Navigator.of(context).pushReplacement(MaterialPageRoute(
            builder: (BuildContext context) => restlistview())));
}

另一种方法。

initState(){
 super.initState();
 fetchData().then((value){
   Navigator.of(context).pushReplacement(MaterialPageRoute(
            builder: (BuildContext context) => restlistview())));
 });
}

Future fetchData()async{
//Fetch your data here.
}