Flutter自适应瀑布流,android设计模式面试题

Flutter自适应瀑布流,android设计模式面试题,第1张

Flutter自适应瀑布流,android设计模式面试题

ff_annotation_route_library: any

http_client_helper: any

intl: any

like_button: any

loading_more_list: any

pull_to_refresh_notification: any

url_launcher: any

1.图片自适应:

Widget image = Stack(

children: [

ExtendedImage.network(

item.imageUrl,

shape: BoxShape.rectangle,

//clearMemoryCacheWhenDispose: true,

border: Border.all(color: Colors.grey.withOpacity(0.4), width: 1.0),

borderRadius: const BorderRadius.all(

Radius.circular(10.0),

),

loadStateChanged: (ExtendedImageState value) {

if (value.extendedImageLoadState == LoadState.loading) {

Widget loadingWidget = Container(

alignment: Alignment.center,

color: Colors.grey.withOpacity(0.8),

child: CircularProgressIndicator(

strokeWidth: 2.0,

valueColor:

AlwaysStoppedAnimation(Theme.of©.primaryColor),

),

);

if (!konwSized) {

//todo: not work in web

loadingWidget = AspectRatio(

aspectRatio: 1.0,

child: loadingWidget,

);

}

return loadingWidget;

} else if (value.extendedImageLoadState == LoadState.completed) {

item.imageRawSize = Size(

value.extendedImageInfo.image.width.toDouble(),

value.extendedImageInfo.image.height.toDouble());

}

return null;

},

),

Positioned(

top: 5.0,

right: 5.0,

child: Container(

padding: const EdgeInsets.all(3.0),

decoration: BoxDecoration(

color: Colors.grey.withOpacity(0.6),

border: Border.all(color: Colors.grey.withOpacity(0.4), width: 1.0),

borderRadius: const BorderRadius.all(

Radius.circular(5.0),

),

),

child: Text(

‘${index + 1}’,

textAlign: TextAlign.center,

style: const TextStyle(fontSize: fontSize, color: Colors.white),

),

),

)

],

);

if (konwSized) {

image = AspectRatio(

aspectRatio: item.imageSize.width / item.imageSize.height,

child: image,

);

} else if (item.imageRawSize != null) {

image = AspectRatio(

aspectRatio: item.imageRawSize.width / item.imageRawSize.height,

child: image,

);

}

return Column(

crossAxisAlignment: CrossAxisAlignment.start,

children: [

image,

const SizedBox(

height: 5.0,

),

buildTagsWidget(item),

const SizedBox(

height: 5.0,

),

buildBottomWidget(item),

],

);

}

2.自适应标签:

Widget buildTagsWidget(

TuChongItem item, {

int maxNum = 6,

}) {

const double fontSize = 12.0;

return Wrap(

runSpacing: 5.0,

spacing: 5.0,

children: item.tags.take(maxNum).map((String tag) {

final Color
color = item.tagColors[item.tags.indexOf(tag)];

return Container(

padding: const EdgeInsets.all(3.0),

decoration: BoxDecoration(

color: color,

border: Border.all(color: Colors.grey.withOpacity(0.4), width: 1.0),

borderRadius: const BorderRadius.all(

Radius.circular(5.0),

),

),

child: Text(

tag,

textAlign: TextAlign.start,

style: TextStyle(

fontSize: fontSize,

color: color.computeLuminance() < 0.5

? Colors.white
Colors.black),

),

);

}).toList());

}

3.上拉刷新下拉加载

class PullToRefreshHeader extends StatelessWidget {

const PullToRefreshHeader(this.info, this.lastRefreshTime, {this.color});

final PullToRefreshScrollNotificationInfo info;

final DateTime lastRefreshTime;

final Color color;

@override

Widget build(BuildContext context) {

if (info == null) {

return Container();

}

String text = ‘’;

if (info.mode == RefreshIndicatorMode.armed) {

text = ‘Release to refresh’;

} else if (info.mode == RefreshIndicatorMode.refresh ||

info.mode == RefreshIndicatorMode.snap) {

text = ‘Loading…’;

} else if (info.mode == RefreshIndicatorMode.done) {

text = ‘Refresh completed.’;

} else if (info.mode == RefreshIndicatorMode.drag) {

text = ‘Pull to refresh’;

} else if (info.mode == RefreshIndicatorMode.canceled) {

text = ‘Cancel refresh’;

}

final TextStyle ts = const TextStyle(

color: Colors.grey,

).copyWith(fontSize: 13);

final double dragOffset = info?.dragOffset ?? 0.0;

final DateTime time = lastRefreshTime ?? DateTime.now();

final double top = -hideHeight + dragOffset;

return Container(

height: dragOffset,

color: color ?? Colors.transparent,

//padding: EdgeInsets.only(top: dragOffset / 3),

//padding: EdgeInsets.only(bottom: 5.0),

child: Stack(

children: [

Positioned(

left: 0.0,

right: 0.0,

top: top,

child: Row(

mainAxisAlignment: MainAxisAlignment.center,

crossAxisAlignment: CrossAxisAlignment.center,

children: [

Expanded(

child: Container(

alignment: Alignment.centerRight,

child: RefreshImage(top),

margin: const EdgeInsets.only(right: 12.0),

),

),

Stack(

children: [

Positioned(

left: 0.0,

right: 0.0,

top: top,

child: Row(

mainAxisAlignment: MainAxisAlignment.center,

crossAxisAlignment: CrossAxisAlignment.center,

children: [

Expanded(

child: Container(

alignment: Alignment.centerRight,

child: RefreshImage(top),

margin: const EdgeInsets.only(right: 12.0),

),

),

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5716529.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存