Flutter Flatter中的资源图像文件路径?
我想发布一个带有预填充Sqflite数据库(用户可以修改)的应用程序 我已经添加了大约100个图像作为资产,需要将它们作为文件图像而不是资产图像来读取(因此,在不同的屏幕上读取和加载图像将很容易,无需复制图像) 所以需要知道如何获取存储在Assets文件夹中的图像的文件路径(路径将在sqflite数据库中硬编码)Flutter Flatter中的资源图像文件路径?,flutter,sqflite,flutter-image,Flutter,Sqflite,Flutter Image,我想发布一个带有预填充Sqflite数据库(用户可以修改)的应用程序 我已经添加了大约100个图像作为资产,需要将它们作为文件图像而不是资产图像来读取(因此,在不同的屏幕上读取和加载图像将很容易,无需复制图像) 所以需要知道如何获取存储在Assets文件夹中的图像的文件路径(路径将在sqflite数据库中硬编码) 请按正确的方向操作。因此,您希望从数据库中读取图像并将其加载到屏幕,而不是从应用程序资产中读取图像?。我认为flatter可以更快地从应用程序资产中加载它们,而且不需要数据库查询的开销
请按正确的方向操作。因此,您希望从数据库中读取图像并将其加载到屏幕,而不是从应用程序资产中读取图像?。我认为flatter可以更快地从应用程序资产中加载它们,而且不需要数据库查询的开销 在sqflite中保留路径,如“assets/images/1.png”,并使用rootBundle进行访问
您不需要绝对路径,如/sdcard0/…
仅保留资产路径
ByteData imageData1 = await rootBundle.load('assets/images/1.png');
使用ByteData列表保存图像List<ByteData> imageList = [];
完整代码
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),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _计数器=0;
列表imageList=[];
void _incrementCounter()异步{
ByteData imageData1=等待rootBundle.load('assets/images/1.png');
ByteData imageData2=等待rootBundle.load('assets/images/2.png');
打印(imageData1.toString());
imageList.add(imageData1);
imageList.add(imageData2);
设置状态(){
_计数器++;
打印(imageList.length.toString());
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:ListView.builder(
itemCount:imageList.length,
itemBuilder:(上下文,索引){
返回Image.memory(imageList[index].buffer.asUint8List());
},
),
浮动操作按钮:浮动操作按钮(
按下时:\ u递增计数器,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
我也遇到了这种情况,因为我想用存储在资产中的图像预填充我的Hive数据库,而我的应用程序使用FileImage加载图像 我发现您不能引用位于资产中的文件或图像路径,因为它一直在变化,所以更好的做法是:
您还可以使用Android Studio中的设备文件资源管理器检查资产文件夹的位置,并亲自查看它是否正在更改。根据我的经验,它位于code_cache>build>Flatter_assets>assets中。谢谢您的回答,但我的情况完全不同,我们的应用程序将有资产图像,并且为用户添加图像提供了便利,两者都将显示在同一屏幕上(使用相同的列表视图生成器),并且这些图像在03个屏幕之间使用,每个都有不同的sqflite数据库,我在我的应用程序中到处都使用Image.file(我觉得这很好)。因此,我希望使用image.file解决问题。我希望从应用程序资产中读取图像,但不是使用image.assets/memory,而是使用image.file类。
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),
),
);
}
}