【发布时间】:2021-11-24 15:33:01
【问题描述】:
我有一个页面,在这个页面上我展示了数据卡。我应要求收到此数据(getTaskDetails)。我得到一组数据并在卡片上显示这些数据。但问题是我想每 20 秒进行一次这些查询。更新我页面上的数据。这是我的代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:uhf_scan/model/setting/globalvar.dart' as global;
import 'dart:async';
import 'dart:io';
import 'dart:convert';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:uhf_scan/model/PageUhf/PageUhf.dart';
import 'package:qrscan/qrscan.dart' as scanner;
import 'package:flutter/services.dart';
class TaskList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: TaskListParse(),
);
}
}
class TaskListParse extends StatefulWidget {
TaskListParse() : super();
@override
_JsonParseObjectsTask createState() => _JsonParseObjectsTask();
}
class _JsonParseObjectsTask extends State <StatefulWidget> {
String limit = global.limit.toString();
List<TaskDetails> _searchResult = [];
List<TaskDetails> _taskDetails = [];
List<TaskDetails> _taskBarcode = [];
TextEditingController controller = new TextEditingController();
String? _mySeals;
Future<Null> getTaskDetails() async {
final String url = global.urlVar ;
HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
final request = await client
.getUrl(Uri.parse(url))
.timeout(Duration(seconds: 5));
HttpClientResponse response = await request.close();
var responseBody = await response.transform(utf8.decoder).join();
final responseJson = json.decode(responseBody);
if (200 == response.statusCode) {
setState(() {
for (Map<String,dynamic> user in responseJson) {
_taskDetails.add(TaskDetails.fromJson(user));
}
});
}
}
@override
void initState() {
super.initState();
getTaskDetails();
}
Widget _buildUsersList() {
return new ListView.builder(
itemCount: _taskDetails.length,
itemBuilder: (context, index) {
return new Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
color: Colors.white38,
margin: EdgeInsets.symmetric(vertical: 7),
child: ListTile(
title: Text(
_taskDetails[index].name,
style: TextStyle(fontSize: 15,
color: Colors.black)
),
leading: FaIcon(FontAwesomeIcons.truck),
onTap: () =>
{
global.taskId = _taskDetails[index].id,
global.taskName = _taskDetails[index].name,
Navigator.push(
context,
MaterialPageRoute(builder: (context) => ScanUhf()),
)
}
),
);
},
);
}
Widget _buildSearchResults() {
return new ListView.builder(
itemCount: _searchResult.length,
itemBuilder: (context, i) {
return new Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
color: Colors.white38,
margin: EdgeInsets.symmetric(vertical: 7),
child: ListTile(
title: Text(
_searchResult[i].name,
style: TextStyle(fontSize: 15),
),
leading: Icon(
Icons.home_outlined,
size: 30,
color: Colors.black87,
),
onTap: () =>
{
global.taskId = _searchResult[i].id,
global.taskName = _searchResult[i].name,
Navigator.push(
context,
MaterialPageRoute(builder: (context) => ScanUhf()),
)
}
),
);
},
);
}
Widget _buildSearchBox() {
return new Container(
color: Colors.blueGrey,
padding: const EdgeInsets.all(8.0),
child: new Card(
margin: EdgeInsets.symmetric(vertical: 7),
child: new ListTile(
leading: new Icon(Icons.search),
title: new TextField(
controller: controller,
decoration: new InputDecoration(
hintText: 'Пошук', border: InputBorder.none),
onChanged: onSearchTextChanged,
),
trailing: new IconButton(
icon: new Icon(Icons.cancel),
onPressed: () {
controller.clear();
onSearchTextChanged('');
},
),
),
),
);
}
Widget _buildBody() {
return new Scaffold(
body:Container(
child:Column(
children: <Widget>[
new Container(
color: Theme.of(context).primaryColor, child: _buildSearchBox()),
new Expanded(
child: _searchResult.length != 0 || controller.text.isNotEmpty
? _buildSearchResults()
: _buildUsersList()),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
_scanQR();
});
},
child: const Icon(Icons.qr_code_scanner_sharp),
backgroundColor: Colors.pink,
),
);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: _buildBody()
);
}
onSearchTextChanged(String text) async {
_searchResult.clear();
if (text.isEmpty) {
setState(() {});
return;
}
_taskDetails.forEach((userDetail) {
if (userDetail.name.toLowerCase().contains(text.toLowerCase()))
_searchResult.add(userDetail);
});
setState(() {});
}
Future _scanQR () async {
try {
String? cameraScanResult = await scanner.scan();
setState(() {
_mySeals = cameraScanResult; // setting string result with cameraScanResult
});
} on PlatformException catch (e) {
print(e);
}
}
}
class TaskDetails {
final String id, name;
TaskDetails({required this.id,required this.name});
factory TaskDetails.fromJson(Map<String, dynamic> json) {
return new TaskDetails(
id: json['id'],
name: json['name']
);
}
}
一切正常。但是要更新数据,我需要再次访问该页面。我想通过留在页面上来更新这些数据。我将不胜感激)
【问题讨论】: