【问题标题】:Asset images File path in flutter?资产图像文件路径颤动?
【发布时间】:2020-02-10 18:42:09
【问题描述】:

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

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

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

感谢您朝着正确的方向前进。

【问题讨论】:

    标签: flutter sqflite flutter-image


    【解决方案1】:

    所以您想从数据库中读取图像并将它们加载到屏幕上,而不是从应用程序资产中读取它们?我认为 Flutter 从应用程序资产中加载它们的速度更快,而且没有数据库查询的开销。

    【讨论】:

    • 我想从应用程序资产中读取图像,但不是使用 image.assets/memory,而是使用 image.file 类。
    【解决方案2】:

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

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

    使用字节数据列表保存图像

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

    【讨论】:

    • 感谢您的回答,但我的情况完全不同,我们的应用程序将具有资产图像,并且还允许用户添加图像,两者都将显示在同一屏幕中(具有相同的列表视图builder),这些图像在 03 个屏幕之间使用,每个屏幕都有不同的 sqflite 数据库,我在我的应用程序中到处使用 Image.file(我觉得这很好)。所以我希望使用 image.file 的任何解决方法。
    【解决方案3】:

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

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

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

    reference

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

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2021-07-10
      • 2023-03-31
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多