Принятый ответ работает хорошо для меня.Но в моем случае изображение загружается через сеть, поэтому темный край виден даже тогда, когда изображение еще не показано, что мне не правильно.Поэтому у меня есть другой подход, использующий frameBuilder
- который является одним из свойств Image
.Еще один плюс этого метода - нам не нужно использовать Stack
:
Image.network(
"https://foo.com/bar.jpg",
width: double.infinity,
height: expandedHeight,
fit: BoxFit.fitWidth,
frameBuilder: (BuildContext context, Widget child, int frame, bool wasSynchronouslyLoaded) {
if (wasSynchronouslyLoaded || frame != null) {
return Container(
child:child,
foregroundDecoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
const Color(0xCC000000),
const Color(0x00000000),
const Color(0x00000000),
const Color(0xCC000000), ]
)
),
height: expandedHeight,
width: double.infinity,
);
} else {
return Container(
child: CircularProgressIndicator(
value: null,
backgroundColor: Colors.white),
alignment: Alignment(0, 0),
constraints: BoxConstraints.expand(),
);
}
},
),
. Используя этот фрагмент кода, я смог задержать отображение темного края до тех пор, пока изображение не будет показано.Если wasSynchronouslyLoaded
равно true
, то это означает, что изображение может быть загружено мгновенно, если оно ложно, мы должны полагаться на frame
, чтобы определить, доступно ли изображение для отображения или нет.Если изображение еще не доступно, тогда в качестве заполнителя для изображения будет отображаться CircularProgressIndicator
.