资产图像文件路径抖动?

时间:2019-10-14 07:12:48

标签: flutter sqflite flutter-image

我想提供一个带有预先填充的Sqflite数据库(可以由用户修改)的应用。

我已经添加了大约100张图像作为资产,并且需要将它们读取为文件图像而不是资产图像(因此可以轻松读取并在不同屏幕中加载图像,而无需复制图像)。

因此需要知道如何获取存储在Assets文件夹中的图像的文件路径(该路径将在sqflite数据库中进行硬编码)。

赞赏朝正确方向前进。

3 个答案:

答案 0 :(得分:0)

因此,您想从数据库中读取图像并将它们加载到屏幕上,而不是从应用程序资产?中读取它们。我认为Flutter可以更快地从应用程序资产中加载它们,而不会产生数据库查询的开销。

答案 1 :(得分:0)

保留sqflite中的路径(例如“ assets / images / 1.png”)并使用rootBundle访问
您不需要绝对路径,例如/ sdcard0 / ....
仅保留资产路径

ByteData imageData1 = await rootBundle.load('assets/images/1.png');

使用ByteData列表保存图像

List<ByteData> imageList = [];

使用ListView通过Image.memory显示图像

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),
      ),
    );
  }
}

enter image description here

答案 2 :(得分:0)

我也遇到过这种情况,因为我想用存储在资产中的图像预先填充我的 Hive 数据库,而我的应用程序使用 FileImage 加载图像。

我发现您无法引用 Assets 中的文件或图像路径,因为它一直在变化,所以更好:

  1. 使用 rootBundle.load
  2. 加载图像/文件
  3. 使用 writeAsBytesSync
  4. 复制图像/文件
  5. 使用复制图像的路径并从那里加载

reference

您还可以使用 Android Studio 中的设备文件资源管理器检查资产文件夹所在的位置,并亲自查看它是否发生变化。根据我的经验,它位于 code_cache > build > flutter_assets > assets。