102 lines
3.4 KiB
Dart
102 lines
3.4 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:dartboard_resume/dartboard_parser.dart';
|
|
import 'package:dartboard_resume/dartboard_widgets.dart';
|
|
import 'package:pdf/pdf.dart';
|
|
import 'package:pdf/widgets.dart';
|
|
|
|
Page generatePdfPage({required DartboardData dartboardData, required int renderNs}) {
|
|
final List<Widget> groupedExperienceList = dartboardData.groupedExperiences.entries.map<Widget>(
|
|
(entry) {
|
|
final String subsection = entry.key;
|
|
final List<DartboardExperience> experiences = entry.value;
|
|
return Column(
|
|
children: [
|
|
Row(
|
|
children: [
|
|
Text(
|
|
subsection,
|
|
style: dartboardData.subheaderTextStyle
|
|
.merge(const TextStyle(fontSize: 18))
|
|
.apply(color: const PdfColorGrey(0.2)),
|
|
),
|
|
],
|
|
),
|
|
Container(height: 2, width: 200, color: const PdfColorGrey(0.7)),
|
|
...experiences.map(
|
|
(DartboardExperience exp) => Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(exp.title, style: dartboardData.subheaderTextStyle.apply(color: const PdfColorGrey(0.3))),
|
|
Text(
|
|
exp.range.toString(),
|
|
style: dartboardData.subheaderTextStyle.apply(color: const PdfColorGrey(0.42)),
|
|
),
|
|
],
|
|
),
|
|
...exp.attributes.map(
|
|
(a) => Text(
|
|
"${dartboardData.dartboardTheme.bulletPoint} $a",
|
|
style: dartboardData.defaultTextStyle.apply(
|
|
color: const PdfColorGrey(0.55),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(height: 20),
|
|
],
|
|
),
|
|
),
|
|
DartboardFooter(dartboardData: dartboardData, renderNs: renderNs),
|
|
],
|
|
);
|
|
},
|
|
).toList();
|
|
return Page(
|
|
pageTheme: const PageTheme(pageFormat: PdfPageFormat.standard),
|
|
build: (Context context) {
|
|
return Column(
|
|
children: [
|
|
SizedBox(
|
|
height: 120,
|
|
width: double.infinity,
|
|
child: Stack(
|
|
children: [
|
|
Positioned(
|
|
left: 0,
|
|
child: Container(
|
|
height: 100,
|
|
width: 100,
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
image: DecorationImage(
|
|
fit: BoxFit.contain,
|
|
image: MemoryImage(
|
|
File(dartboardData.imagePath).readAsBytesSync(),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
Center(
|
|
child: Column(
|
|
children: [
|
|
Text(dartboardData.fullName, style: dartboardData.headerTextStyle),
|
|
Text(dartboardData.phoneNumber, style: dartboardData.headerTextStyle),
|
|
Text(dartboardData.email, style: dartboardData.headerTextStyle),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Container(height: 20),
|
|
...groupedExperienceList,
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|