【发布时间】:2020-08-11 19:18:27
【问题描述】:
我正在尝试编写一个从 Firebase 存储文件夹下载图像并将其显示在网格中的页面。当我第一次导航到此页面时,我对此没有任何问题。但是,一旦我导航到另一个页面,然后返回此页面,图像就不再加载。函数getImage() 用于加载图像。它被称为initState()。是不是因为它只在页面第一次打开时调用一次?
页面导航的代码sn-p如下:
class RouteGenerator {
static Route<dynamic> generateRoute(RouteSettings settings) {
// Getting arguments passed in while calling Navigator.pushNamed
final args = settings.arguments;
switch (settings.name) {
...
case '/stichpage':
// Validation of correct data type
return MaterialPageRoute(
builder: (_) => ImagesScreen(),
);
...
}
这是页面的实际代码:
import 'package:flutter/material.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'dart:typed_data';
import 'dataholder.dart';
class ImagesScreen extends StatelessWidget {
Widget makeImagesGrid() {
return GridView.builder(
itemCount: "objectname".length,
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemBuilder: (context, index) {
return ImageGridItem(index);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.lightBlue,
elevation: 5,
title: Text('Image Stitching'),
centerTitle: true,
),
body: Container(
child: makeImagesGrid(),
),
bottomNavigationBar: BottomAppBar(
color: Colors.grey[200],
child: Row(
children: [
Spacer(),
IconButton(icon: Icon(Icons.save), onPressed: () {}),
],
),
),
floatingActionButton: FloatingActionButton.extended(
backgroundColor: Colors.lightBlue,
foregroundColor: Colors.white,
onPressed: () {},
icon: Icon(Icons.burst_mode),
label: Text('Stitch'),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
);
}
}
class ImageGridItem extends StatefulWidget {
int _index;
ImageGridItem(int index) {
this._index = index;
}
@override
_ImageGridItemState createState() => _ImageGridItemState();
}
class _ImageGridItemState extends State<ImageGridItem> {
Uint8List imageFile;
StorageReference photosReference =
FirebaseStorage.instance.ref().child("images");
getImage() {
if (!requestedIndexes.contains(widget._index)) {
int maxSize = 7 * 1024 * 1024;
photosReference
.child("cell${widget._index}.png")
.getData(maxSize)
.then((data) {
this.setState(() {
imageFile = data;
});
imageData.putIfAbsent(widget._index, () {
return data;
});
}).catchError((error) {
debugPrint(error.toString());
});
requestedIndexes.add(widget._index);
}
}
Widget decideGridTileWidget() {
if (imageFile == null) {
return Center(child: Text(""));
} else {
return Image.memory(
imageFile,
fit: BoxFit.cover,
);
}
}
@override
void initState() {
super.initState();
if (!imageData.containsKey(widget._index)) {
getImage();
} else {
this.setState(() {
imageFile = imageData[widget._index];
});
}
}
@override
Widget build(BuildContext context) {
return GridTile(child: decideGridTileWidget());
}
}
以及保存图像数据的代码:
import 'dart:typed_data';
Map<int, Uint8List> imageData = {};
List<int> requestedIndexes = [];
【问题讨论】:
-
当您说“导航出去”时,您的意思是推送另一个视图?还是跳到上一个视图?
-
推送到另一个视图。基本上是页面导航代码 sn-p 但不是
'/stichpage'它是'/dashboard'
标签: firebase flutter dart firebase-storage