首页 > 解决方案 > 使用 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"),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

标签: flutter

解决方案


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 。这应该可以解决问题;


推荐阅读