128 lines
4.5 KiB
Dart
128 lines
4.5 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:rogapp/model/destination.dart';
|
|
import 'package:rogapp/utils/database_helper.dart';
|
|
|
|
class HistoryPage extends StatefulWidget {
|
|
const HistoryPage({super.key});
|
|
|
|
@override
|
|
State<HistoryPage> createState() => _HistoryPageState();
|
|
}
|
|
|
|
class _HistoryPageState extends State<HistoryPage> {
|
|
DatabaseHelper db = DatabaseHelper.instance;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text("通過履歴"),
|
|
),
|
|
body: SingleChildScrollView(
|
|
child: Column(
|
|
children: [
|
|
FutureBuilder(
|
|
future: db.getDestinations(),
|
|
builder: (BuildContext context,
|
|
AsyncSnapshot<List<Destination>> snapshot) {
|
|
if (snapshot.connectionState == ConnectionState.done) {
|
|
if (snapshot.hasError) {
|
|
return Center(
|
|
child: Text(
|
|
'${snapshot.error} occurred',
|
|
style: TextStyle(fontSize: 18),
|
|
),
|
|
);
|
|
} else if (snapshot.hasData) {
|
|
final dests = snapshot.data;
|
|
if (dests!.length > 0) {
|
|
print("----- history -----");
|
|
return Container(
|
|
width: MediaQuery.of(context).size.width,
|
|
height: MediaQuery.of(context).size.height,
|
|
child: ListView.builder(
|
|
itemCount: dests.length,
|
|
itemBuilder: (ctx, index) {
|
|
print("--- photo ${dests[index].checkin_image!} ----");
|
|
return Padding(
|
|
padding: const EdgeInsets.all(8.0),
|
|
child: CustomWidget(title: dests[index].name!,
|
|
subtitle: "${dests[index].sub_loc_id} : ${dests[index].name}",
|
|
image1: dests[index].checkin_image != null ? Image.file(File(dests[index].checkin_image!)) : null,
|
|
image2: dests[index].buypoint_image != null ? Image.file(File(dests[index].buypoint_image!)) : null,
|
|
),
|
|
);
|
|
|
|
}));
|
|
} else {
|
|
return Center(child: Text("No checkin yet"));
|
|
}
|
|
}
|
|
} else if (snapshot.connectionState ==
|
|
ConnectionState.waiting) {
|
|
return Center(
|
|
child: CircularProgressIndicator(),
|
|
);
|
|
}
|
|
return Container();
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class CustomWidget extends StatelessWidget {
|
|
final Image? image1;
|
|
final Image? image2;
|
|
final String title;
|
|
final String subtitle;
|
|
|
|
CustomWidget({
|
|
this.image1,
|
|
this.image2,
|
|
required this.title,
|
|
required this.subtitle,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Container(
|
|
width: 104, // 50 (width of each image) + 2 (space between images) + 2*1 (padding on both sides)
|
|
child: Row(
|
|
children: [
|
|
if (image1 != null) SizedBox(width: 50, height: 100, child: image1,),
|
|
if (image1 != null && image2 != null) SizedBox(width: 2),
|
|
if (image2 != null) SizedBox(width: 50, height: 100, child: image2,),
|
|
],
|
|
),
|
|
),
|
|
SizedBox(width: 10),
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
title,
|
|
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
|
maxLines: null, // Allows the text to wrap onto an unlimited number of lines
|
|
),
|
|
Text(
|
|
subtitle,
|
|
style: TextStyle(fontSize: 16),
|
|
maxLines: null, // Allows the text to wrap onto an unlimited number of lines
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|