在Flutter中从子窗口小部件按返回按钮后如何不调用didChangeDependencies()?]

问题描述 投票:1回答:1

我正在使用提供程序包通过调用didChangeDependencies()方法将产品加载到数组中。即使由于过滤器而进行了一些更改并且新产品被获取,然后在notifyListeners()的帮助下成功重建了此页面,此方法也可以正常工作。尽管当我点击产品卡以查看产品详细信息屏幕并返回到所有产品屏幕时出现问题,但是再次调用didChangeDependencies并刷新了整个页面。返回此页面时,有什么方法可以停止触发didChangeDependencies(),或者有其他更好的方法来实现我在这里所做的工作?

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'loader.dart';
import '../screens/product_overview.dart';
import '../providers/user.dart';

class AllProducts extends StatefulWidget {
  final double deviceHeight;
  final double deviceWidth;
  AllProducts(this.deviceHeight, this.deviceWidth);
  @override
  _AllProductsState createState() => _AllProductsState();
}

class _AllProductsState extends State<AllProducts> {
  List _products = [];
  bool _isLoading = true;
  bool _gettingMoreProducts = false;

  _loadMoreProducts() async {
    print('Reached end of list');
    if (_gettingMoreProducts) {
      print('Already getting products');
      return;
    }
    print('Firestore function called');
    _gettingMoreProducts = true;
    dynamic newProducts =
        await Provider.of<User>(context, listen: false).getProducts();
    _products.addAll(newProducts);
    setState(() {});
    print('New Products added');
    _gettingMoreProducts = false;
  }

  @override
  void didChangeDependencies() {
    setState(() {
      _isLoading = true;
    });
    print('Getting new products from init state');
    Provider.of<User>(context).getProducts().then((products) {
      setState(() {
        _products = products;
        _isLoading = false;
      });
    });
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        margin: EdgeInsets.only(top: 5),
        height: widget.deviceHeight * 0.80,
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),
        ),
        child: _isLoading
            ? Loader()
            : ListView.builder(
                itemCount: _products.length,
                itemBuilder: (context, index) {
                  // if (index == _products.length - 1) {
                  //   _loadMoreProducts();
                  // }
                  return Dismissible(
                    key: UniqueKey(),
                    onDismissed: (direction) {
                      setState(() {
                        _products.removeAt(index);
                      });
                    },
                    background: Container(
                      color: Colors.red,
                      child: Icon(
                        Icons.cancel,
                        color: Colors.white,
                        size: 50,
                      ),
                    ),
                    secondaryBackground: Container(
                      color: Colors.green,
                      child: Icon(
                        Icons.check,
                        color: Colors.white,
                        size: 50,
                      ),
                    ),
                    child: Padding(
                      padding: const EdgeInsets.all(8.0),
                      // Product Overview builds a simple card for product and whenever I tap on card it moves to product detail screen which is just a simple screen with product details and when I press back button from that page all products rebuild again due to didchangedependencies.
                      child: ProductOverview(_products[index],
                          widget.deviceHeight, widget.deviceWidth),
                    ),
                  );
                },
              ));
  }
}

我正在使用提供程序包通过调用didChangeDependencies()方法将产品加载到数组中。即使由于过滤器而有所更改,并且获取了新产品,此方法也能正常工作...

flutter dart
1个回答
0
投票

您可以尝试升级到Flutter SDK> = Beta v1.14.6。 Team Flutter已在此版本中对其进行了修复。

© www.soinside.com 2019 - 2024. All rights reserved.