Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何正确地为无状态小部件预缓存图像?_Flutter_Preload - Fatal编程技术网

Flutter 如何正确地为无状态小部件预缓存图像?

Flutter 如何正确地为无状态小部件预缓存图像?,flutter,preload,Flutter,Preload,我试图避免图像加载延迟,这会使它在我的无状态SplashScreen中弹出,但没有运气。 我试图在main()中加载图像并将其传递给构造函数,但没有任何更改 我读了很多关于同一个问题的答案,并且都在有状态小部件的扩展状态类中使用了didChangeDependencies中的precacheImage,所以我尝试了它,但结果仍然是一样的,即使是下面的答案示例和本文 关于图像预加载程序: 类AboutPageImagePreload扩展StatefulWidget{ @凌驾 _AboutPageI

我试图避免图像加载延迟,这会使它在我的无状态SplashScreen中弹出,但没有运气。 我试图在
main()
中加载图像并将其传递给构造函数,但没有任何更改

我读了很多关于同一个问题的答案,并且都在有状态小部件的扩展状态类中使用了
didChangeDependencies
中的
precacheImage
,所以我尝试了它,但结果仍然是一样的,即使是下面的答案示例和本文

关于图像预加载程序:
类AboutPageImagePreload扩展StatefulWidget{
@凌驾
_AboutPageImagePrederState createState()=>_AboutPageImagePrederState();
}
类_AboutPageImagePrederState扩展状态{
图像桌面;
图像移动;
@凌驾
void initState(){
super.initState();
bgimadesktop=Image.asset('assets/aboutUsDesktopBg.jpg');
bgImageMobile=Image.asset('assets/aboutUsMobileBg2.jpg');
}
@凌驾
void didChangeDependencies(){
super.didChangeDependencies();
precacheImage(bgimadesktop.image,上下文);
precacheImage(bgImageMobile.image,上下文);
}
@凌驾
小部件构建(构建上下文){
返回大约页(bgImageDesktop:bgImageDesktop,bgImageMobile:bgImageMobile);
}
}
在“主页”和
AboutPage
构造器中添加了必要的图像,但当网站加载时,背景第一个bg图像仍然没有加载。。所以我的变通方法不适用于web

我不敢相信像加载图像这样的基本操作会这么复杂。。让我觉得弗利特毕竟不是个好选择。。 您知道预缓存在web上是否还不起作用吗? 我在最新的开发频道


非常感谢。

使
precacheImage
方法与我的第一次尝试结合使用的一种方法是使SplashScreen保持无状态。然后
main()。
通过这种方式,它所有的加载没有闪烁的bg图像

main()的子对象:
class\u FixitState扩展状态{
最终FirebaseAnalytics analytics=FirebaseAnalytics();
形象标识;
图像登录;
@凌驾
void initState(){
super.initState();
logo=Image.asset('assets/notification.png');
loginBg=Image.asset('assets/mainBg.png');
}
@凌驾
void didChangeDependencies(){
super.didChangeDependencies();
图像(logo.image、context);
precacheImage(loginBg.image,context);
}
@凌驾
小部件构建(构建上下文){
...
主页:BlocBuilder(
生成器:(上下文、状态){
如果(状态未经验证){
返回LoginScreen(userRepository:widget.\u userRepository,bgImage:loginBg,);
}
...
返回飞溅屏幕(徽标:徽标);
...
SplashScreen(无状态):
类SplashScreen扩展了无状态小部件{
最终图像标识;
const SplashScreen({Key-Key,@required this.logo}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:Colors.redAccent,
正文:中(
孩子:填充(
填充:边缘组。对称(垂直:20),
子:列(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
大小盒子(
身高:150,
),
图像(图像:徽标。图像,高度:170,
宽度:170,),
大小盒子(
身高:60,
),
扩大(
子:文本(
AppLocalizations.instance.text(“启动屏幕消息”),
textAlign:textAlign.center,
样式:TextStyle(
颜色:颜色,白色,
尺寸:25,
fontWeight:fontWeight.w500,
字母间距:1.5),
),
),
],
),
),
),
);
}
}
class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => _SplashScreenState();
  
}

class _SplashScreenState extends State<SplashScreen> {

  Image logo;

  @override
  void initState() {
    super.initState();
    logo = Image.asset(
      'assets/notification.png',
      height: 170,
      width: 170,
    );
  }

    @override
      void didChangeDependencies() {
      super.didChangeDependencies();
      precacheImage(logo.image, context);

    }
  @override
  Widget build(BuildContext context) {


    return Scaffold(
      backgroundColor: Colors.redAccent,
      body: Center(
        child: Padding(
          padding: EdgeInsets.symmetric(vertical: 20),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              SizedBox(
                height: 150,
              ),
              logo,
              SizedBox(
                height: 60,
              ),
              Expanded(
                child: Text(
                  AppLocalizations.instance.text('Splash screen message'),
                  textAlign: TextAlign.center,
                  style: TextStyle(
                      color: Colors.white,
                      fontSize: 25,
                      fontWeight: FontWeight.w500,
                      letterSpacing: 1.5),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case HomeRoute:
      return _getPageRoute((HomePage()));
    case AboutRoute:
      return _getPageRoute(AboutPage());
    case RetailerAccessRoute:
      return _getPageRoute(RetailerAccess());
  }
}
Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case HomeRoute:
      return _getPageRoute((HomePageImagePreloader()));
    case AboutRoute:
      return _getPageRoute(AboutPageImagePreloader());
    case RetailerAccessRoute:
      return _getPageRoute(RetailerAccess());
  }
}
class AboutPageImagePreloader extends StatefulWidget {
  @override
  _AboutPageImagePreloaderState createState() => _AboutPageImagePreloaderState();
}

class _AboutPageImagePreloaderState extends State<AboutPageImagePreloader> {
  Image bgImageDesktop;
  Image bgImageMobile;

  @override
  void initState() {
    super.initState();
    bgImageDesktop = Image.asset('assets/aboutUsDesktopBg.jpg');
    bgImageMobile = Image.asset('assets/aboutUsMobileBg2.jpg');
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    precacheImage(bgImageDesktop.image, context);
    precacheImage(bgImageMobile.image, context);

  }
  @override
  Widget build(BuildContext context) {
    return AboutPage(bgImageDesktop: bgImageDesktop, bgImageMobile: bgImageMobile);
  }
}
class _FixitState extends State<Fixit> {
  final FirebaseAnalytics analytics = FirebaseAnalytics();
  Image logo;
  Image loginBg;

  @override
  void initState() {
    super.initState();
    logo = Image.asset('assets/notification.png');
    loginBg = Image.asset('assets/mainBg.png');
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    precacheImage(logo.image, context);
    precacheImage(loginBg.image, context);

  }

  @override
  Widget build(BuildContext context) {

...

home: BlocBuilder<AuthenticationBloc, AuthenticationState>(
        builder: (context, state) {

          if (state is Unauthenticated) {
            return LoginScreen(userRepository: widget._userRepository, bgImage: loginBg,);
          }

...

return SplashScreen(logo: logo);
...
class SplashScreen extends StatelessWidget {
  final Image logo;

  const SplashScreen({Key key, @required this.logo}) : super(key: key);

  @override
  Widget build(BuildContext context) {


    return Scaffold(
      backgroundColor: Colors.redAccent,
      body: Center(
        child: Padding(
          padding: EdgeInsets.symmetric(vertical: 20),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: <Widget>[
              SizedBox(
                height: 150,
              ),
              Image(image: logo.image,height: 170,
                width: 170,),
              SizedBox(
                height: 60,
              ),
              Expanded(
                child: Text(
                  AppLocalizations.instance.text('Splash screen message'),
                  textAlign: TextAlign.center,
                  style: TextStyle(
                      color: Colors.white,
                      fontSize: 25,
                      fontWeight: FontWeight.w500,
                      letterSpacing: 1.5),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}