flutter - 使用 RefreshIndicator 刷新 Flutter 中的类
问题描述
我需要刷新我的FutureBuilder
=> Listview.builder
=> Listtile
,但我发现没有解决方法。当我进行热重载时,它会更新,所以必须有办法重新加载整个类?如果我只能更新 Listview.builder/FutureBuilder/ListTile,它的 enIt 也足够了。我的 .dart 代码:
import 'dart:async' show Future;
import 'package:ListGet/QR_Code/QR_Code_main.dart';
import 'package:ListGet/global/classes/routing_consting.dart';
import 'package:ListGet/localization/localizatzion_constants.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';
import 'package:ListGet/global/global.dart' as globals;
import 'package:ListGet/global/classes/OverviewProduct.dart';
import 'package:flutter/material.dart';
import '../../main.dart';
class OverViewList extends StatefulWidget {
OverViewList({Key key}) : super(key: key);
@override
_OverViewListState createState() => _OverViewListState();
}
class _OverViewListState extends State<OverViewList> {
String data = "";
@override
Widget build(BuildContext context) {
return Scaffold(
body: RefreshIndicator(
onRefresh: _loadproductsoverview,
child: Container(
child: Column(
children: [
Expanded(
child: Container(
child: FutureBuilder(
builder: (context, snapshot) {
var showData = json.decode(snapshot.data.toString());
globals.jsongetitemlist = showData;
if (snapshot.hasData) {
return ListView.builder(
itemCount: showData.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.fromLTRB(12, 0, 12, 0),
child: GestureDetector(
onLongPress: () {
loadproductsoverview(index).then(
(value) => print(globals.productName));
},
onDoubleTap: () {
print("2");
},
onTap: () {
print("3");
},
child: Card(
child: ListTile(
contentPadding:
EdgeInsets.fromLTRB(8, 5, 5, 5),
title: Padding(
padding: const EdgeInsets.fromLTRB(
0, 0, 0, 10),
child:
Text(showData[index]["Product_Name"]),
),
subtitle: Text(getLang(context, "stock") +
" : " +
showData[index]["Stock"] +
"\n" +
getLang(context, "expiry_date") +
" " +
showData[index]["Expiry_date"]),
),
),
),
);
},
);
}
return CircularProgressIndicator();
},
future: DefaultAssetBundle.of(context).loadString(
"lib/global/Overview_Products/Overview_Product.json"),
),
),
),
Container(
color: "dark" == "dark"
? globals.darkThemeslide4
: globals.whiteThemeslide7,
height: 46,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(4, 5, 15, 5),
child: IconButton(
onPressed: () => _scan(),
icon: Icon(Icons.qr_code_scanner_rounded),
iconSize: 30,
tooltip: "Scan your Product",
),
),
Padding(
padding: const EdgeInsets.fromLTRB(4, 5, 15, 5),
child: IconButton(
onPressed: () {
Navigator.pushNamed(context, InterfaceViewRoute,
arguments: "");
print(globals.themeswitch);
main();
},
icon: Icon(Icons.edit),
iconSize: 30,
tooltip: "Enter your Product by your self",
),
),
],
),
),
],
),
),
),
);
}
Future<String> _loadproductsoverview() async {
print("1");
return await rootBundle
.loadString('lib/global/Overview_Products/Overview_Product.json');
}
Future loadproductsoverview(index) async {
String jsonString = await _loadproductsoverview();
final jsonResponse = json.decode(jsonString);
OverviewProducts student =
new OverviewProducts.fromJson(jsonResponse[index]);
globals.productName = student.productName;
}
// ignore: missing_return
Future<String> _scan() async {
await FlutterBarcodeScanner.scanBarcode(
"#000000", "Back", true, ScanMode.BARCODE)
.then((value) => setState(() => data = value));
if (data != "-1") {
Navigator.pushNamed(context, InterfaceViewRoute, arguments: data);
}
}
}
test() {}
当我从上到下滑动时,所有条目都应该从 json 中更新。
也试过这个:
class _OverViewListState extends State<OverViewList> {
String data = "";
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: Column(
children: [
Expanded(
child: Container(
child: FutureBuilder(
builder: (context, snapshot) {
var showData = json.decode(snapshot.data.toString());
globals.jsongetitemlist = showData;
if (snapshot.hasData) {
return RefreshIndicator(
onRefresh: _loadproductsoverview,
child: ListView.builder(
itemCount: showData.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: EdgeInsets.fromLTRB(12, 0, 12, 0),
child: GestureDetector(
onLongPress: () {
loadproductsoverview(index).then(
(value) => print(globals.productName));
},
onDoubleTap: () {
print("2");
},
onTap: () {
print("3");
},
child: Card(
child: ListTile(
contentPadding:
EdgeInsets.fromLTRB(8, 5, 5, 5),
title: Padding(
padding: const EdgeInsets.fromLTRB(
0, 0, 0, 10),
child:
Text(showData[index]["Product_Name"]),
),
subtitle: Text(getLang(context, "stock") +
" : " +
showData[index]["Stock"] +
"\n" +
getLang(context, "expiry_date") +
" " +
showData[index]["Expiry_date"]),
),
),
),
);
},
),
);
}
return CircularProgressIndicator();
},
future: DefaultAssetBundle.of(context).loadString(
"lib/global/Overview_Products/Overview_Product.json"),
),
),
),
Container(
color: "dark" == "dark"
? globals.darkThemeslide4
: globals.whiteThemeslide7,
height: 46,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
Padding(
padding: const EdgeInsets.fromLTRB(4, 5, 15, 5),
child: IconButton(
onPressed: () => _scan(),
icon: Icon(Icons.qr_code_scanner_rounded),
iconSize: 30,
tooltip: getLang(context, "tooltip_qrcode"),
),
),
Padding(
padding: const EdgeInsets.fromLTRB(4, 5, 15, 5),
child: IconButton(
onPressed: () {
Navigator.pushNamed(context, InterfaceViewRoute,
arguments: "");
print(globals.themeswitch);
main();
},
icon: Icon(Icons.edit),
iconSize: 30,
tooltip: getLang(context, "tooltip_pencil"),
),
),
],
),
),
],
),
),
);
}
解决方案
Future<String> _loadproductsoverview() async {
print("1");
setState(() {}); // <======= Add here
return await rootBundle
.loadString('lib/global/Overview_Products/Overview_Product.json');
}
Future loadproductsoverview(index) async {
String jsonString = await rootBundle.loadString('lib/global/Overview_Products/Overview_Product.json'); //<== dont call the function here
final jsonResponse = json.decode(jsonString);
OverviewProducts student =
new OverviewProducts.fromJson(jsonResponse[index]);
globals.productName = student.productName;
}
_loadproductsoverview()
请在方法中添加一个 setState 。这应该可以解决问题;
推荐阅读
- c++ - C++ 中的线程池不使用来自 args 的引用
- java - 如何安全地将查询参数合并到 Python 或 Java 中的 AWS TimeStream 查询中?
- python - 如何将列表写入新的 Excel 工作簿?
- c++ - C++:递归二分算法不断返回 0
- android - 蓝牙 Gatt 服务器 Android 设备 Null
- pandas - 使用多元素计算的交叉表
- python - 破折号不刷新页面
- apache-samza - 应用部署在yarn中时samza如何生成container.id?
- flutter - 颤振未处理的异常:类型'_InternalLinkedHashMap
' 不是类型 'List 的子类型 ' - html - 如何在 html 文件中粘贴值,该值作为字典从 Django 传递到 html,如果我使用“{{}}”,则该值将粘贴到模板中