AlbumPage.dart 10.2 KB
/*
 * @author lsy
 * @date   2019-09-09
 **/
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:gengmei_flutter_plugin/ScanImagePlugn.dart';
import 'package:gengmei_flutter_plugin_example/AlbumModel/bean/DirBean.dart';

import 'AlbumModel.dart';

class AlbumPage extends StatefulWidget {
  AlbumModel model;

  AlbumPage(bool showCamera, int maxCount, List<String> selectedList) {
    model = new AlbumModel(showCamera, maxCount, selectedList);
  }

  @override
  State<StatefulWidget> createState() => AlbumState(model);
}

class AlbumState extends State<AlbumPage> {
  final AlbumModel _model;

  AlbumState(this._model);

  @override
  void initState() {
    super.initState();
    _model.initScanImages(context);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          leading: GestureDetector(
              onTap: () => Navigator.pop(context, ""),
              child: Center(
                child: Container(
                  padding: EdgeInsets.fromLTRB(16, 0, 0, 0),
                  child: Text("取消"),
                ),
              )),
          centerTitle: true,
          title: GestureDetector(
              onTap: () {
                _model.changPopState();
              },
              child: StreamBuilder<String>(
                  stream: _model.titleData.stream,
                  initialData: _model.titleData.data,
                  builder: (context, data) {
                    return Row(
                      children: <Widget>[
                        Expanded(
                          child: Container(),
                        ),
                        data.data == null
                            ? Text(
                                MainDirExplain,
                                style: TextStyle(fontSize: 18),
                              )
                            : Text(data.data, style: TextStyle(fontSize: 18)),
                        Container(
                          margin: EdgeInsets.fromLTRB(1, 0, 0, 0),
                          child: Transform(
                            transform: Matrix4.identity()
                              ..rotateZ(_model.showPop ? 1.6 : 4.7), // 旋转的角度
                            origin: Offset(10, 10), // 旋转的中心点
                            child: Icon(
                              Icons.chevron_right,
                              size: 20,
                            ),
                          ),
                        ),
                        Expanded(
                          child: Container(),
                        ),
                      ],
                    );
                  })),
          actions: <Widget>[
            Center(
                child: GestureDetector(
                    onTap: () => _model.onNext(context),
                    child: Container(
                      margin: EdgeInsets.fromLTRB(0, 0, 16, 0),
                      child: Text(
                        "下一步",
                        style: TextStyle(fontSize: 16),
                      ),
                    )))
          ],
        ),
        body: Stack(
          children: <Widget>[
            mainView(),
            popWindow(),
          ],
        ));
  }

  @override
  void dispose() {
    super.dispose();
    _model.dispose();
  }

  mainView() {
    return StreamBuilder<List<ScanImageItem>>(
      stream: _model.albumLive.stream,
      initialData: _model.albumLive.data,
      builder:
          (BuildContext context, AsyncSnapshot<List<ScanImageItem>> imgList) {
//        print("FINALL  $imgList  ${imgList.data}");
        if (imgList.data == null) {
          return Center(child: CircularProgressIndicator());
        }
        if (imgList.data != null && imgList.data.isEmpty) {
          return Center(
            child: Text("没有发现照片哦"),
          );
        }
        return GridView.builder(
          gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount: 4,
              crossAxisSpacing: 1,
              mainAxisSpacing: 1,
              childAspectRatio: 1),
          itemCount: imgList.data.length + 2,
          itemBuilder: (BuildContext context, int index) {
            if (index == 0) {
              return GestureDetector(
                  onTap: () => _model.nativeCamera(context),
                  child: Container(
                      color: Colors.yellow,
                      child: Column(
                        children: <Widget>[
                          Expanded(
                            child: Container(),
                          ),
                          Icon(Icons.camera_alt),
                          Container(
                            margin: EdgeInsets.fromLTRB(0, 5, 0, 0),
                            child: Text("本地相机"),
                          ),
                          Expanded(
                            child: Container(),
                          ),
                        ],
                      )));
            }
            if (index == 1) {
              return GestureDetector(
                  onTap: () => _model.AiCamera(context),
                  child: Container(
                      color: Colors.orange,
                      child: Column(
                        children: <Widget>[
                          Expanded(
                            child: Container(),
                          ),
                          Icon(Icons.camera_alt),
                          Container(
                            margin: EdgeInsets.fromLTRB(0, 5, 0, 0),
                            child: Text("AI相机"),
                          ),
                          Expanded(
                            child: Container(),
                          ),
                        ],
                      )));
            }
            int newIndex = index - 2;
            if (imgList.data[newIndex] == null ||
                    imgList.data[newIndex].path == null
//                || imgList.data[newIndex].realPath == null
                ) {
              return Container();
            }
            return GestureDetector(
                onTap: (){
                  _model.previewItem(context, newIndex, "pageName");
//                  _model.clickItem(context, newIndex);
                },
                child: Container(
                  decoration: BoxDecoration(
                      image: DecorationImage(
                          image: FileImage(File(imgList.data[newIndex].path)),
                          fit: BoxFit.cover),
                      borderRadius: BorderRadius.all(Radius.circular(3.0))),
                  margin: EdgeInsets.only(left: 2, top: 2, right: 2, bottom: 2),
                  child: Stack(
                    alignment: AlignmentDirectional.topEnd,
                    children: <Widget>[
                      _model.isSelect(newIndex)
                          ? Icon(
                              Icons.check_circle,
                              color: Colors.amberAccent,
                              size: 25,
                            )
                          : Icon(
                              Icons.check_circle_outline,
                              color: Colors.grey,
                              size: 25,
                            ),
                      imgList.data[newIndex].isVideo
                          ? Icon(
                              Icons.cancel,
                              color: Colors.yellow,
                            )
                          : Container(),
                      _model.isFullSelect() && !_model.isSelect(newIndex)
                          ? Container(
                              width: double.maxFinite,
                              height: double.maxFinite,
                              color: Colors.white60,
                            )
                          : Container(),
                      imgList.data[newIndex].isVideo&&imgList.data[newIndex].during != null
                          ? Text(
                              imgList.data[newIndex].during,
                              style:
                                  TextStyle(fontSize: 20, color: Colors.green),
                            )
                          : Container()
                    ],
                  ),
                ));
          },
        );
      },
    );
  }

  popWindow() {
    return StreamBuilder<List<DirBean>>(
        stream: _model.dirLive.stream,
        initialData: _model.dirLive.data,
        builder: (BuildContext context, AsyncSnapshot<List<DirBean>> snapshot) {
          if (snapshot.data == null) {
            return Container();
          } else {
            return Stack(
              children: <Widget>[
                Container(
                  width: double.maxFinite,
                  height: double.maxFinite,
                  color: Colors.black54,
                ),
                popWindowList(snapshot)
              ],
            );
          }
        });
  }

  popWindowList(AsyncSnapshot<List<DirBean>> snapshot) {
    return Container(
        padding: EdgeInsets.fromLTRB(16, 3, 16, 3),
        color: Colors.white,
        height: 280,
        child: ListView.separated(
            separatorBuilder: (context, index) {
              return Divider();
            },
            itemCount: snapshot.data.length,
            itemBuilder: (context, index) {
              return GestureDetector(
                onTap: () => _model.selectDir(index),
                child: Row(
                  children: <Widget>[
                    Container(
                      width: 50,
                      height: 50,
                      child: Image.file(
                        snapshot.data[index].pic,
                        fit: BoxFit.cover,
                      ),
                    ),
                    Container(
                      padding: EdgeInsets.fromLTRB(5, 0, 0, 0),
                      child: Text(
                          "${snapshot.data[index].dirName} (${snapshot.data[index].picCount})"),
                    ),
                    Expanded(
                      child: Container(),
                    ),
                    Icon(Icons.chevron_right)
                  ],
                ),
              );
            }));
  }
}