Актив изображения Путь к файлу в флаттере? - PullRequest
0 голосов
/ 14 октября 2019

Я хотел отправить приложение с предварительно заполненной базой данных Sqflite (которая может быть изменена пользователем).

Я добавил около 100 изображений в качестве активов, и мне нужно читать их как файлы изображений вместо изображений активов(чтобы можно было легко читать и загружать изображения на разных экранах, не копируя изображения).

Поэтому необходимо знать, как получить путь к файлу (путь будет жестко задан в sqflite databse) для изображений, хранящихся вПапка с активами.

Приветствуется толчок в правильном направлении.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Сохранение пути в 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

0 голосов
/ 14 октября 2019

То есть вы хотите читать изображения из базы данных и загружать их на экран вместо того, чтобы читать их из ресурсов приложения? Я думаю, что Flutter загружает их из активов приложения быстрее и без накладных расходов на запрос к базе данных.

...