Flutter:条件文件检查中的“(路径):不能为空”

时间:2019-05-27 08:53:58

标签: image flutter null

我正在尝试为应用程序提供一个用户先前选择的背景,或者在找不到文件的情况下使用默认图像。

代码很简单:

decoration: BoxDecoration(
  color: Colors.blueAccent,
  image: DecorationImage(
    image: File(customImageFile).existsSync() ? FileImage(File(customImageFile)) : backgroundImage,
    fit: BoxFit.fill,
  ),
),

应用程序在条件行崩溃,并表示(路径):不能为null。我已经尝试了多种方法来解决此问题,但是我要特别指出的是“如果文件路径为null,请不要使用它。请使用我为您制作的这张图片”。但是无论如何,它还是很沮丧。

还有另外一种方法可以达到预期的效果吗?

编辑:

按照@Vikas的要求,涉及到更完整的代码示例:

ImageProvider backgroundImage;
String themeLoader = 'blueTheme';
String customImageFile;

//声明

void initState() {
  _loadThemeSettings();
  super.initState();
}

//初始化

_loadThemeSettings() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  themeLoader = prefs.getString('themeColour' ?? 'blueTheme');
  customImageFile = prefs.getString('customImageFile' ?? 'empty')
  if (customImageFile != null) {
    if(File(customImageFile).existsSync()) {
      prefs.setString('customImageFile', customImageFile);
    } else {
      print('Path not valid');
    }
  } else {
    print('customImageFile is NULL');
  }

    if (themeLoader != null) {
          switch (themeLoader) {
            case 'blueTheme':
              {
                colorBloc.changeColor('blueTheme');
                setState(() {
                  backgroundImage = ExactAssetImage('lib/images/bg_blue_new.jpg');
                  buttonTheme = AppState.blueTheme;
                }
              }
              break;

            } else {
              print('Theme loader was NULL');
            }
          }
        }
      }

//在运行时加载先前选择的主题。 case语句中有几种颜色,但是它们都是相同的,您就会明白。

@override
Widget build(BuildContext context) {
   return WillPopScope(
  onWillPop: () => _exitApp(context),
  child: Scaffold(
    body: SafeArea(
      child: BlocProvider<ColorBloc>(
        bloc: colorBloc,
        child: Container(
          child: Stack(
            children: [
              Container(
                decoration: BoxDecoration(
                  color: Colors.blueAccent,
                  image: DecorationImage(
                    image: (customImageFile != null && File(customImageFile).existsSync()) ? FileImage(File(customImageFile)) : backgroundImage,
                    fit: BoxFit.fill,
                  ),
                ),

//就在这里,其他所有东西都可以正常工作。其余的生成方法与此问题无关,并且可以正常工作,但无论如何在这里:

                    child: SafeArea(
                      child: Stack(
                        children: <Widget>[
                          Column(
                            mainAxisAlignment: MainAxisAlignment.end,
                            children: <Widget>[
                              themesVisible == true
                                  ? SizedBox()
                                  : buttonRow(),
                              SizedBox(
                                height: 20,
                              ),
                            ],
                          ),
                          Padding(
                            padding: EdgeInsets.all(15),
                            child: topMenuRow(),
                          ),
                        ],
                      ),
                    ),
                  ),
                  BlocProvider<CustomToggleBloc>(
                  bloc: customToggleBloc,
                    child: Center(
                      child: Container(
                        child: themesVisible == true ? singlePlayerThemes(singlePlayerCallbacks: callBacks) : scoreText(),
                      ),
                    ),
                  ),//bloc
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }

0 个答案:

没有答案