【发布时间】:2019-01-30 00:19:13
【问题描述】:
最近我在一个类似画廊的项目上工作,该项目显示了来自数据库的一堆图像。我使用 MySQL 是因为我有一个专用服务器,并且由于定价原因,使用 firestore 可能不是一个好主意。我希望它有一个无限滚动视图,每次加载 10 张图片,但目前它同时加载所有图片,这让应用感觉非常慢。
这是我的 lib/main.dart
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:http/http.dart' as http;
//local import, you can ignore it
import './nav.dart';
import './detail.dart';
import './placeholder.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyApp createState() => new _MyApp();
}
class _MyApp extends State<MyApp> {
Future<List> getData() async {
final resp = await http.get("http://192.168.43.68/API/readImage.php");
return json.decode(resp.body);
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return new MaterialApp(
theme: new ThemeData.dark(),
home: Scaffold(
appBar: new AppBar(
title: new Text("Title"),
),
drawer: Nav(),
body: new FutureBuilder(
future: getData(),
builder: (context, snapshot) {
if (snapshot.hasError) {
print(snapshot.error);
}
return snapshot.hasData
? new ItemList(
list: snapshot.data,
)
: new Center(child: new CircularProgressIndicator());
},),),);}}
//Item builder to display each image
class ItemList extends StatelessWidget {
final List list;
ItemList({this.list});
@override
Widget build(BuildContext context) {
// TODO: implement build
return new Padding(
padding: const EdgeInsets.all(0.0),
child: new StaggeredGridView.countBuilder(
crossAxisCount: 4,
itemCount: list.length,
itemBuilder: (BuildContext context, int index) => new Container(
child: new GestureDetector(
onTap: () => Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => new Detail(
list: list,
index: index,
))),
child: Card(
child: new Column(
children: <Widget>[
new Stack(
children: <Widget>[
FadeInImage.memoryNetwork(
placeholder: kTransparentImage,
image: list[index]['url'],
),],),
new Padding(
padding: EdgeInsets.all(4.0),
child: new Column(
children: <Widget>[
new Text(list[index]['name'],
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white70,
))],),)],),))),
staggeredTileBuilder: (index) => new StaggeredTile.fit(2),
),);}}
这是我的 readImage.php(我仍然不知道该怎么做)
<?php
include 'dbcon.php';
$sth = "SELECT * FROM pict INNER JOIN user ON pict.uid=user.uid LIMIT 10";
$result = $conn->query($sth);
$outp = array();
$outp = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($outp);
enter code here
仅此而已,我们将不胜感激。
【问题讨论】:
-
谢谢,它真的很有帮助,然后问题是一次从数据库中加载所有数据可以吗?你知道可能像一个分页并将数据从下一页插入到列表中
-
不,一次加载所有数据是个坏主意,你需要一个分页
-
yups,所以它就像一个分页,让我们说每次加载 10 个数据,每次更新都将数据添加到现有列表并显示它?所以我需要做一个 void 来获取数据
-
是的,阅读帖子
标签: android ios mysql dart flutter