155 lines
5.6 KiB
Dart
155 lines
5.6 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:rogapp/model/destination.dart';
|
|
import 'package:rogapp/utils/database_helper.dart';
|
|
import 'package:get/get.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("pass_history".tr),
|
|
),
|
|
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: const TextStyle(fontSize: 18),
|
|
),
|
|
);
|
|
} else if (snapshot.hasData) {
|
|
final dests = snapshot.data;
|
|
if (dests!.isNotEmpty) {
|
|
debugPrint("----- 通過履歴表示 -----");
|
|
return SizedBox(
|
|
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".tr));
|
|
}
|
|
}
|
|
} else if (snapshot.connectionState ==
|
|
ConnectionState.waiting) {
|
|
return const Center(
|
|
child: CircularProgressIndicator(),
|
|
);
|
|
}
|
|
return Container();
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class CustomWidget extends StatelessWidget {
|
|
final Image? image1;
|
|
final Image? image2;
|
|
final String title;
|
|
final String subtitle;
|
|
|
|
const CustomWidget({
|
|
super.key,
|
|
this.image1,
|
|
this.image2,
|
|
required this.title,
|
|
required this.subtitle,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Row(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
SizedBox(
|
|
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) const SizedBox(width: 2),
|
|
if (image2 != null)
|
|
SizedBox(
|
|
width: 50,
|
|
height: 100,
|
|
child: image2,
|
|
),
|
|
],
|
|
),
|
|
),
|
|
const SizedBox(width: 10),
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
title,
|
|
style:
|
|
const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
|
|
maxLines:
|
|
null, // Allows the text to wrap onto an unlimited number of lines
|
|
),
|
|
Text(
|
|
subtitle,
|
|
style: const TextStyle(fontSize: 16),
|
|
maxLines:
|
|
null, // Allows the text to wrap onto an unlimited number of lines
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|