opt: article content

This commit is contained in:
bggRGjQaUbCoE
2024-10-12 13:58:14 +08:00
parent 1ecbaf16c7
commit 17f0277be9
3 changed files with 242 additions and 76 deletions

View File

@@ -1,9 +1,9 @@
import 'package:PiliPalaX/common/widgets/network_img_layer.dart';
import 'package:PiliPalaX/models/dynamics/article_content_model.dart';
import 'package:PiliPalaX/pages/preview/view.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:get/get.dart';
class ArticleContent extends StatelessWidget {
const ArticleContent({
@@ -15,22 +15,51 @@ class ArticleContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
List<String>? imgList = list
.where((item) => item.pic != null)
.toList()
.map((item) => item.pic?.pics?.first.url ?? '')
.toList();
return SliverList.separated(
itemCount: list.length,
itemBuilder: (_, index) {
ArticleContentModel item = list[index];
if (item.insert is String) {
return SelectableText(
(item.insert as String).replaceAll('\n', '\n\n'),
style: TextStyle(
letterSpacing: 0.3,
fontSize: FontSize.large.value,
height: LineHeight.percent(125).size,
fontWeight:
item.attributes?.bold == true ? FontWeight.bold : null,
if (item.text != null) {
List<InlineSpan> spanList = [];
item.text?.nodes?.forEach((item) {
spanList.add(TextSpan(
text: item.word?.words,
style: TextStyle(
letterSpacing: 0.3,
fontSize: FontSize.large.value,
height: LineHeight.percent(125).size,
fontStyle:
item.word?.style?.italic == true ? FontStyle.italic : null,
color: item.word?.color != null
? Color(int.parse(
item.word!.color!.replaceFirst('#', 'FF'),
radix: 16,
))
: null,
decoration: item.word?.style?.strikethrough == true
? TextDecoration.lineThrough
: null,
fontWeight:
item.word?.style?.bold == true ? FontWeight.bold : null,
),
));
});
return SelectableText.rich(TextSpan(children: spanList));
} else if (item.line != null) {
return Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 10),
child: CachedNetworkImage(
imageUrl: item.line?.pic?.url ?? '',
height: item.line?.pic?.height?.toDouble(),
),
);
} else if (item.attributes?.clazz == 'normal-img') {
} else if (item.pic != null) {
return LayoutBuilder(
builder: (_, constraints) => GestureDetector(
onTap: () {
@@ -39,8 +68,8 @@ class ArticleContent extends StatelessWidget {
context: context,
builder: (context) {
return ImagePreview(
initialPage: 0,
imgList: [item.insert.nativeImage?.url],
initialPage: imgList.indexOf(item.pic!.pics!.first.url!),
imgList: imgList,
);
},
);
@@ -48,22 +77,12 @@ class ArticleContent extends StatelessWidget {
child: NetworkImgLayer(
width: constraints.maxWidth,
height: constraints.maxWidth *
item.insert.nativeImage?.height /
item.insert.nativeImage?.width,
src: item.insert.nativeImage?.url,
item.pic!.pics!.first.height! /
item.pic!.pics!.first.width!,
src: item.pic!.pics!.first.url,
),
),
);
// return image(
// constrainedWidth,
// [
// ImageModel(
// width: item.insert.nativeImage?.width,
// height: item.insert.nativeImage?.height,
// url: item.insert.nativeImage?.url,
// ),
// ],
// );
} else {
return const SizedBox.shrink();
// return Text('unsupported content');