Flutter Flatter中的资源图像文件路径?

Flutter Flatter中的资源图像文件路径?,flutter,sqflite,flutter-image,Flutter,Sqflite,Flutter Image,我想发布一个带有预填充Sqflite数据库(用户可以修改)的应用程序 我已经添加了大约100个图像作为资产,需要将它们作为文件图像而不是资产图像来读取(因此,在不同的屏幕上读取和加载图像将很容易,无需复制图像) 所以需要知道如何获取存储在Assets文件夹中的图像的文件路径(路径将在sqflite数据库中硬编码) 请按正确的方向操作。因此,您希望从数据库中读取图像并将其加载到屏幕,而不是从应用程序资产中读取图像?。我认为flatter可以更快地从应用程序资产中加载它们,而且不需要数据库查询的开销

我想发布一个带有预填充Sqflite数据库(用户可以修改)的应用程序

我已经添加了大约100个图像作为资产,需要将它们作为文件图像而不是资产图像来读取(因此,在不同的屏幕上读取和加载图像将很容易,无需复制图像)

所以需要知道如何获取存储在Assets文件夹中的图像的文件路径(路径将在sqflite数据库中硬编码)


请按正确的方向操作。

因此,您希望从数据库中读取图像并将其加载到屏幕,而不是从应用程序资产中读取图像?。我认为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加载图像

我发现您不能引用位于资产中的文件或图像路径,因为它一直在变化,所以更好的做法是:

  • 使用rootBundle加载图像/文件。加载
  • 使用writeAsBytesSync复制图像/文件
  • 使用复制图像的路径并从那里加载

  • 您还可以使用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),
          ),
        );
      }
    }