问题描述
无法找到与分页兼容的对象。
这是我当前的代码:
$this->paginate = ['limit' => 10];
$comment = TableRegistry::get('Comments');
$comments = $comment
->find()
->where(['Comments.post_id' => $id])
->contain(['Users'])
->order(['Comments.created' => 'ASC'])
->all()
->toArray(); //the results will be array
$comments = $this->paginate($comments);
谢谢!
解决方法
内置的分页器不支持数组,仅适用于查询。如果需要对数组进行分页,则必须构建自定义分页器。
但是,首先不需要传递数组,而是传递查询,如果确实需要,则将分页器返回的结果集(import 'package:flutter/material.dart';
import 'dart:convert';
import 'dart:io';
import 'dart:async';
import 'package:csv/csv.dart';
void main() {
runApp(App());
}
class App extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,),home: HomePage(title: 'Flutter Demo Home Page'),);
}
}
class HomePage extends StatefulWidget {
HomePage({Key key,this.title}) : super(key: key);
final String title;
@override
_AppState createState() => _AppState();
}
Future<List<List<dynamic>>> fetchUserData() async {
final request = await HttpClient().getUrl(Uri.parse(
'https://docs.google.com/spreadsheets/d/e/2PACX-1vQvf9tp4-fETDJbC-HRmRKvVFAXEAGO4lrYPpVeiYkB6nqqXdSs3CjX0eBMvjIoEeX9_qU6K2RWmzVk/pub?gid=0&single=true&output=csv'));
final response = await request.close();
List<List<dynamic>> rowsAsListOfValues;
await for (final csvString in response.transform(const Utf8Decoder())) {
rowsAsListOfValues = const CsvToListConverter().convert(csvString);
}
return rowsAsListOfValues;
}
class _AppState extends State<HomePage> {
List<List<dynamic>> rowsAsListOfValues;
// ScrollController _controller;
@override
void didChangeDependencies() async {
super.didChangeDependencies();
rowsAsListOfValues = await fetchUserData();
super.setState(() {}); // to update widget data
}
@override
void initState() {
super.initState();
// _controller = ScrollController();
// _controller = new ScrollController()..addListener(_scrollListener);
}
/*
void _scrollListener() {
if (_controller.position.extentAfter <= 0.0 &&
_controller.offset >= _controller.position.maxScrollExtent &&
!_controller.position.outOfRange) {
print("call fetch method again");
}
} */
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
rowsAsListOfValues == null
? Text("Loading data...")
: Text(
'',// $rowsAsListOfValues
),rowsAsListOfValues == null
? CircularProgressIndicator()
: DataTable(
showCheckboxColumn: false,// <-- this is important
columns: const <DataColumn>[
DataColumn(
label: Text(
'City',style: TextStyle(fontStyle: FontStyle.italic),DataColumn(
label: Text(
'Branches',],rows: List.generate(rowsAsListOfValues.length - 1,(index) {
return DataRow(
onSelectChanged: (bool selected) {
if (selected) {
print('index-selected: ${rowsAsListOfValues[index + 1][0]}');
}
},cells: <DataCell>[
// DataCell(Text('${rowsAsListOfValues[index + 1][0]}')),// Index
DataCell(Text('${rowsAsListOfValues[index + 1][1]}')),// city
DataCell(Text('${rowsAsListOfValues[index + 1][2]}')),// branch
],);
}),);
}
}
)转换为数组,这是相同的结果,即:
\Cake\ORM\ResultSet|\Cake\Datasource\ResultSetInterface
我不确定您为什么要这么做,因为结果集实现了$comments = $comment
->find()
->where(['Comments.post_id' => $id])
->contain(['Users'])
->order(['Comments.created' => 'ASC']);
$comments = $this->paginate($comments);
$comments = $comments->toArray();
,也就是说,它可以像数组一样被迭代和访问,您只是通过进行这种转换来限制自己。
此外,还没有真正简单的方法可以自动执行此操作,唯一接近的方法是使用模型的beforeFind()
event/callback修改查询,并附加一个result formatter来将结果集转换为数组,但是结果格式化程序应返回\ArrayAccess
,因为它们在某种程度上也承诺会返回。格式化程序是按顺序处理的,后续的格式化程序将接收先前的格式化程序返回的值。