|
@@ -1,5 +1,4 @@
|
1
|
1
|
import 'dart:async';
|
2
|
|
-import 'dart:io';
|
3
|
2
|
import 'dart:typed_data';
|
4
|
3
|
|
5
|
4
|
import 'package:flutter/material.dart';
|
|
@@ -54,8 +53,24 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
54
|
53
|
|
55
|
54
|
bool get changeProviderOnCheckChange => widget.changeProviderOnCheckChange;
|
56
|
55
|
|
57
|
|
- List<ImageEntity> get previewSelectedList =>
|
58
|
|
- widget.result.previewSelectedList;
|
|
56
|
+ PhotoPreviewResult get result => widget.result;
|
|
57
|
+
|
|
58
|
+ /// 缩略图用的数据
|
|
59
|
+ ///
|
|
60
|
+ /// 用于与provider数据联动
|
|
61
|
+ List<ImageEntity> get previewList {
|
|
62
|
+ return selectedProvider.selectedList;
|
|
63
|
+ }
|
|
64
|
+
|
|
65
|
+ /// 选中的数据
|
|
66
|
+ List<ImageEntity> _selectedList = [];
|
|
67
|
+
|
|
68
|
+ List<ImageEntity> get selectedList {
|
|
69
|
+ if (changeProviderOnCheckChange) {
|
|
70
|
+ return previewList;
|
|
71
|
+ }
|
|
72
|
+ return _selectedList;
|
|
73
|
+ }
|
59
|
74
|
|
60
|
75
|
PageController pageController;
|
61
|
76
|
|
|
@@ -63,11 +78,14 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
63
|
78
|
void initState() {
|
64
|
79
|
super.initState();
|
65
|
80
|
pageChangeController.add(0);
|
66
|
|
- previewSelectedList.clear();
|
67
|
|
- previewSelectedList.addAll(selectedProvider.selectedList);
|
68
|
81
|
pageController = PageController(
|
69
|
82
|
initialPage: widget.initIndex,
|
70
|
83
|
);
|
|
84
|
+
|
|
85
|
+ _selectedList.clear();
|
|
86
|
+ _selectedList.addAll(selectedProvider.selectedList);
|
|
87
|
+
|
|
88
|
+ result.previewSelectedList = _selectedList;
|
71
|
89
|
}
|
72
|
90
|
|
73
|
91
|
@override
|
|
@@ -128,7 +146,7 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
128
|
146
|
var index = snapshot.data;
|
129
|
147
|
var data = list[index];
|
130
|
148
|
return CheckboxListTile(
|
131
|
|
- value: previewSelectedList.contains(data),
|
|
149
|
+ value: selectedList.contains(data),
|
132
|
150
|
onChanged: (bool check) {
|
133
|
151
|
if (changeProviderOnCheckChange) {
|
134
|
152
|
_onChangeProvider(check, index);
|
|
@@ -154,9 +172,9 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
154
|
172
|
void _onCheckInOnlyPreview(bool check, int index) {
|
155
|
173
|
var item = list[index];
|
156
|
174
|
if (check) {
|
157
|
|
- previewSelectedList.add(item);
|
|
175
|
+ selectedList.add(item);
|
158
|
176
|
} else {
|
159
|
|
- previewSelectedList.remove(item);
|
|
177
|
+ selectedList.remove(item);
|
160
|
178
|
}
|
161
|
179
|
pageChangeController.add(index);
|
162
|
180
|
}
|
|
@@ -165,12 +183,9 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
165
|
183
|
void _onChangeProvider(bool check, int index) {
|
166
|
184
|
var item = list[index];
|
167
|
185
|
if (check) {
|
168
|
|
- if (selectedProvider.addSelectEntity(item)) {
|
169
|
|
- previewSelectedList.add(item);
|
170
|
|
- }
|
|
186
|
+ selectedProvider.addSelectEntity(item);
|
171
|
187
|
} else {
|
172
|
188
|
selectedProvider.removeSelectEntity(item);
|
173
|
|
- previewSelectedList.remove(item);
|
174
|
189
|
}
|
175
|
190
|
pageChangeController.add(index);
|
176
|
191
|
}
|
|
@@ -187,18 +202,21 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
187
|
202
|
}
|
188
|
203
|
|
189
|
204
|
Widget _buildThumb() {
|
190
|
|
- return Container(
|
191
|
|
- height: 80.0,
|
192
|
|
- child: ListView.builder(
|
193
|
|
- itemBuilder: _buildThumbItem,
|
194
|
|
- itemCount: previewSelectedList.length,
|
195
|
|
- scrollDirection: Axis.horizontal,
|
196
|
|
- ),
|
|
205
|
+ return StreamBuilder(
|
|
206
|
+ builder: (ctx, snapshot) => Container(
|
|
207
|
+ height: 80.0,
|
|
208
|
+ child: ListView.builder(
|
|
209
|
+ itemBuilder: _buildThumbItem,
|
|
210
|
+ itemCount: previewList.length,
|
|
211
|
+ scrollDirection: Axis.horizontal,
|
|
212
|
+ ),
|
|
213
|
+ ),
|
|
214
|
+ stream: pageStream,
|
197
|
215
|
);
|
198
|
216
|
}
|
199
|
217
|
|
200
|
218
|
Widget _buildThumbItem(BuildContext context, int index) {
|
201
|
|
- var item = previewSelectedList[index];
|
|
219
|
+ var item = previewList[index];
|
202
|
220
|
return GestureDetector(
|
203
|
221
|
onTap: () => changeSelected(item, index),
|
204
|
222
|
child: Container(
|
|
@@ -213,7 +231,7 @@ class _PhotoPreviewPageState extends State<PhotoPreviewPage> {
|
213
|
231
|
child: StreamBuilder(
|
214
|
232
|
stream: pageStream,
|
215
|
233
|
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
216
|
|
- if (previewSelectedList.contains(item)) {
|
|
234
|
+ if (selectedList.contains(item)) {
|
217
|
235
|
return Container();
|
218
|
236
|
}
|
219
|
237
|
return Container(
|
|
@@ -247,13 +265,15 @@ class _BigPhotoImageState extends State<BigPhotoImage>
|
247
|
265
|
with AutomaticKeepAliveClientMixin {
|
248
|
266
|
@override
|
249
|
267
|
Widget build(BuildContext context) {
|
|
268
|
+ var width = MediaQuery.of(context).size.width;
|
|
269
|
+ var height = MediaQuery.of(context).size.height;
|
250
|
270
|
return FutureBuilder(
|
251
|
|
- future: widget.imageEntity.thumbDataWithSize(1300, 1300),
|
|
271
|
+ future:
|
|
272
|
+ widget.imageEntity.thumbDataWithSize(width.floor(), height.floor()),
|
252
|
273
|
builder: (BuildContext context, AsyncSnapshot<Uint8List> snapshot) {
|
253
|
274
|
var file = snapshot.data;
|
254
|
275
|
if (snapshot.connectionState == ConnectionState.done && file != null) {
|
255
|
|
- // todo ios 图片优化,在返回时再生成图片
|
256
|
|
- // 展示时,不允许放大,使用原生方案生成一个与屏幕同宽的图片
|
|
276
|
+ print(file.length);
|
257
|
277
|
return Image.memory(
|
258
|
278
|
file,
|
259
|
279
|
fit: BoxFit.contain,
|