Я пытаюсь создать фон для своего приложения, которое либо пользователь выбрал ранее, либо использовать изображение по умолчанию, если файл не найден.
Код очень прост:
decoration: BoxDecoration(
color: Colors.blueAccent,
image: DecorationImage(
image: File(customImageFile).existsSync() ? FileImage(File(customImageFile)) : backgroundImage,
fit: BoxFit.fill,
),
),
Приложение аварийно завершает работу в условной строке, говоря, что (путь): не должен быть нулевым.Я пробовал много способов обойти это, но то, что я специально говорю, это «если путь к файлу пуст, не используйте его. Используйте это изображение, которое я сделал для вас ранее».Но тогда это все равно расстраивается.
Есть ли другой способ, которым я могу достичь желаемого результата здесь?
Редактировать:
По запросу @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
],
),
),
),
),
),
);
}