flutter 资产图像文件路径是否处于抖动状态?

vyswwuz2  于 2023-01-02  发布在  Flutter
关注(0)|答案(3)|浏览(161)

我想船舶与预填充Sqflite数据库的应用程序(这可以由用户修改)。
我已经添加了像100个图像作为资产,需要阅读他们作为文件图像,而不是资产图像(所以它将很容易阅读和加载图像在不同的屏幕上,没有复制的图像)。
因此,需要知道如何获取存储在Assets文件夹中的图像的文件路径(路径将在sqflite数据库中硬编码)。
向正确的方向推进是值得赞赏的。

ldfqzlk8

ldfqzlk81#

因此,您希望从数据库读取图像并将其加载到屏幕上,而不是从应用程序资产阅读它们?我认为Flutter从应用程序资产加载它们更快,而且没有数据库查询的开销。

hsgswve4

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

rdrgkggo

rdrgkggo3#

我也遇到过这种情况,因为我想用存储在资产中的图像预填充我的Hive数据库,而我的应用程序使用FileImage加载图像。
我发现您无法引用位于“资源”中的文件或图像路径,因为它一直在更改,所以更好的方法是:
1.使用rootBundle.load加载映像/文件
1.使用writeAsBytesSync复制映像/文件
1.使用复制映像的路径并从那里加载它
参考文献
您还可以使用Android Studio中的设备文件资源管理器检查assets文件夹的位置,并亲自查看它是否发生了变化。根据我的经验,它位于code_cache〉build〉flutter_assets〉assets中。

相关问题