前提・実現したいこと
ここに質問の内容を詳しく書いてください。
flutterの SharedPreferencesを使って端末内に撮った写真を保存して、それをリストに表示させる機能を作って、無事に写真をリストに表示させる事ができたんですけど、再度実行をした時に無事に表示できていた写真が表示されなくなり、FlutterError Unable to load assetというエラーが起きました。解決方法がわからなくなっていてとても困っております。何方か教えてくれるととても助かります。
該当のソースコード
main.dart
dart
1import 'dart:typed_data'; 2import 'package:flutter/material.dart'; 3import 'package:medicine/calendar_page.dart'; 4import 'package:medicine/main_model.dart'; 5import 'package:medicine/medicine.dart'; 6import 'package:medicine/photo.dart'; 7import 'package:provider/provider.dart'; 8 9import 'add_page.dart'; 10 11void main() { 12 runApp(ListApp()); 13} 14 15class ListApp extends StatelessWidget { 16 // This widget is the root of your application. 17 18 Widget build(BuildContext context) { 19 return MaterialApp( 20 title: 'お薬手帳リスト', 21 theme: ThemeData( 22 backgroundColor: Colors.pink[100], 23 ), 24 home: ListPage(), 25 ); 26 } 27} 28 29class ListPage extends StatefulWidget { 30 31 State<ListPage> createState() => ListHome(); 32} 33 34class ListHome extends State<ListPage> { 35 ListHome({this.medicine}); 36 Medicine? medicine; 37 38 Widget build(BuildContext context) { 39 return ChangeNotifierProvider<MainModel>.value( 40 value: MainModel()..getList(), 41 child: Scaffold( 42 appBar: AppBar( 43 title: Text('お薬手帳アプリ'), 44 backgroundColor: Colors.pink[100], 45 actions: [ 46 IconButton( 47 onPressed: () { 48 Navigator.push( 49 context, 50 MaterialPageRoute( 51 builder: (context) => CalemdarPage(), 52 fullscreenDialog: true, 53 )); 54 }, 55 icon: Icon(Icons.calendar_today), 56 ) 57 ], 58 ), 59 body: Consumer<MainModel>(builder: (context, model, child) { 60 return ListView( 61 children: model.medicineList 62 .map( 63 (medicine) => Card( 64 child: ListTile( 65 tileColor: Colors.pink[100], 66 //リストに画像を表示する。 67 leading: InkWell( 68 onTap: () { 69 Navigator.push( 70 context, 71 MaterialPageRoute( 72 builder: (context) => 73 Photo(memoImage: medicine.image), 74 fullscreenDialog: true, 75 ), 76 ); 77 }, 78 child: FutureBuilder( 79 future: Convarsion.conversionImage( 80 image: medicine.image!), 81 builder: 82 (BuildContext context, AsyncSnapshot snapshot) { 83 if (snapshot.hasData == true) { 84 Uint8List image = snapshot.data; 85 print(image); 86 return Image.memory(image); 87 } else { 88 return Container( 89 width: 45, 90 height: 50, 91 color: Colors.grey, 92 ); 93 } 94 }), 95 ), 96 title: Text( 97 '病院名:${medicine.hospitalText}\n診察科目:${medicine.examinationText}\n日付:${medicine.time}'), 98 textColor: Colors.white, 99 onLongPress: () async { 100 //削除 101 //await deleteDialog(model, context, memo); 102 }, 103 //編集ボタン 104 trailing: IconButton( 105 icon: Icon(Icons.edit), 106 onPressed: () async { 107 await Navigator.push( 108 context, 109 MaterialPageRoute( 110 builder: (context) => AddPage( 111 medicine: medicine, 112 ), 113 fullscreenDialog: true, 114 ), 115 ); 116 model.getList(); 117 }, 118 ), 119 )), 120 ) 121 .toList()); 122 }), 123 floatingActionButton: Consumer<MainModel>( 124 builder: (context, model, child) { 125 return FloatingActionButton( 126 backgroundColor: Colors.pink[100], 127 onPressed: () async { 128 await Navigator.push( 129 context, 130 MaterialPageRoute( 131 builder: (context) => AddPage(), 132 fullscreenDialog: true, 133 ), 134 ).then((value) { 135 //画面が戻ったら処理が発動する 136 model.getList(); 137 }); 138 }, 139 tooltip: '追加する', 140 child: Icon(Icons.add), 141 ); 142 }, 143 ), 144 ), 145 ); 146 } 147}
main_model
dart
1class MainModel extends ChangeNotifier { 2 List<Medicine> medicineList = []; 3 4 Future getList() async { 5 SharedPreferences pref = await SharedPreferences.getInstance(); 6 await pref.reload(); 7 var dataArray = pref.getStringList('medicine'); 8 print('data:$dataArray'); 9 //データの読み込み 10 if (dataArray != null) { 11 medicineList = 12 //json形式にデコードしてリスト化する 13 dataArray 14 .map((data) => Medicine.fromJson(json.decode(data))) 15 .toList(); 16 notifyListeners(); 17 } else { 18 medicineList = []; 19 } 20 } 21 22 Future delete(Medicine medicine) async { 23 medicineList.remove(medicine); 24 //json形式にデコードしてリスト化する 25 List<String> medicineDataList = 26 await medicineList.map((data) => json.encode(data.toJson())).toList(); 27 SharedPreferences pref = await SharedPreferences.getInstance(); 28 //deleteされたデータを保存する 29 pref.setStringList('medicine', medicineDataList); 30 notifyListeners(); 31 print(pref.getStringList('medicine')); 32 } 33 34 void reload() { 35 notifyListeners(); 36 } 37} 38 39class Convarsion { 40 //保存された写真をUint8Listに変換する。 41 static Future<Uint8List> conversionImage({String? image}) async { 42 ///imageのpathをByteDataに変換 43 ByteData byte = await rootBundle.load(image!); 44 45 ///ByteDataをUint8List変換 46 Uint8List list = byte.buffer.asUint8List(); 47 return list; 48 } 49} 50 51
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/07 09:48 編集
2022/03/08 02:16