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 createState() => _HistoryPageState(); } class _HistoryPageState extends State { 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> 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 ), ], ), ), ], ); } }