Files
rog_app/lib/pages/history/history_page.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("----- history -----");
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
),
],
),
),
],
);
}
}