我想船舶与预填充Sqflite数据库的应用程序(这可以由用户修改)。我已经添加了像100个图像作为资产,需要阅读他们作为文件图像,而不是资产图像(所以它将很容易阅读和加载图像在不同的屏幕上,没有复制的图像)。因此,需要知道如何获取存储在Assets文件夹中的图像的文件路径(路径将在sqflite数据库中硬编码)。向正确的方向推进是值得赞赏的。
ldfqzlk81#
因此,您希望从数据库读取图像并将其加载到屏幕上,而不是从应用程序资产阅读它们?我认为Flutter从应用程序资产加载它们更快,而且没有数据库查询的开销。
hsgswve42#
将路径保存在sqflite中,如"assets/images/1.png",并使用rootBundle访问您不需要绝对路径,例如/sdcard0/...。仅保留资源路径
ByteData imageData1 = await rootBundle.load('assets/images/1.png');
使用ByteData列表保存图像
List<ByteData> imageList = [];
使用ListView显示图像,图像内存
return Image.memory(imageList[index].buffer.asUint8List());
全码
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; List<ByteData> imageList = []; void _incrementCounter() async{ ByteData imageData1 = await rootBundle.load('assets/images/1.png'); ByteData imageData2 = await rootBundle.load('assets/images/2.png'); print(imageData1.toString()); imageList.add(imageData1); imageList.add(imageData2); setState(() { _counter++; print(imageList.length.toString()); }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: ListView.builder( itemCount: imageList.length, itemBuilder: (context, index) { return Image.memory(imageList[index].buffer.asUint8List()); }, ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), ); } }
rdrgkggo3#
我也遇到过这种情况,因为我想用存储在资产中的图像预填充我的Hive数据库,而我的应用程序使用FileImage加载图像。我发现您无法引用位于“资源”中的文件或图像路径,因为它一直在更改,所以更好的方法是:1.使用rootBundle.load加载映像/文件1.使用writeAsBytesSync复制映像/文件1.使用复制映像的路径并从那里加载它参考文献您还可以使用Android Studio中的设备文件资源管理器检查assets文件夹的位置,并亲自查看它是否发生了变化。根据我的经验,它位于code_cache〉build〉flutter_assets〉assets中。
3条答案
按热度按时间ldfqzlk81#
因此,您希望从数据库读取图像并将其加载到屏幕上,而不是从应用程序资产阅读它们?我认为Flutter从应用程序资产加载它们更快,而且没有数据库查询的开销。
hsgswve42#
将路径保存在sqflite中,如"assets/images/1.png",并使用rootBundle访问
您不需要绝对路径,例如/sdcard0/...。
仅保留资源路径
使用ByteData列表保存图像
使用ListView显示图像,图像内存
全码
rdrgkggo3#
我也遇到过这种情况,因为我想用存储在资产中的图像预填充我的Hive数据库,而我的应用程序使用FileImage加载图像。
我发现您无法引用位于“资源”中的文件或图像路径,因为它一直在更改,所以更好的方法是:
1.使用rootBundle.load加载映像/文件
1.使用writeAsBytesSync复制映像/文件
1.使用复制映像的路径并从那里加载它
参考文献
您还可以使用Android Studio中的设备文件资源管理器检查assets文件夹的位置,并亲自查看它是否发生了变化。根据我的经验,它位于code_cache〉build〉flutter_assets〉assets中。