【问题标题】:How can i save my data in list that it can be used in entire lifecycle of application in flutter?如何将我的数据保存在列表中,以便在 Flutter 应用程序的整个生命周期中使用?
【发布时间】:2020-03-26 19:11:08
【问题描述】:

在我的颤振应用程序中,我使用具有干净架构的 mvp,当我的服务器点击 api 时返回 5 个项目,当我滚动更多时,它再次点击 api 并获得下 5 个项目。我将这些项目保存在一个列表中,这样我就不能一次又一次地为已经获取的项目调用 api,并且这个列表在 listview.builder 中使用。我使用了底部导航栏,当我从产品项目选项卡移动到任何其他选项卡并从那里来到产品项目时,它再次从 api 获取产品,这不是我想要的。每当我返回时,我想在产品列表选项卡中显示该列表已经获取的列表。 Video of my problem

import 'dart:async';

import 'package:bakery_application/Bloc/TECartBloc.dart';
import 'package:bakery_application/Singleton/CartManager.dart';
import 'package:bakery_application/data/dataSource/product/remote/ProductRemoteDataSource.dart';
import 'package:bakery_application/data/model/responseDTO/ProductResponseDTO.dart';
import 'package:bakery_application/data/model/responseDTO/models/products.dart';
import 'package:bakery_application/data/model/responseDTO/models/productsList.dart';
import 'package:bakery_application/domain/repository/product/ProductRepo.dart';
import 'package:bakery_application/ui/productdetailscreeen/ProductDetailScreen.dart';
import 'package:bakery_application/ui/productscreen/IProductPresenter.dart';
import 'package:bakery_application/ui/productscreen/IProductView.dart';
import 'package:connectivity/connectivity.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:bakery_application/localmodels/ProductModel.dart';
import 'package:bakery_application/widgets/TEProductIncrementor.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'package:provider/provider.dart';

import 'ProductPresenter.dart';

class ProductScreen extends StatefulWidget {
  Key key;
  List<Products> myList = new List<Products>();
  int _pageNumber = 1;
  ProductScreen({
    this.key,
  }) : super(key: key);
  @override
  _ProductScreenState createState() => _ProductScreenState();
}

class _ProductScreenState extends State<ProductScreen> implements IProductView {
  _ProductScreenState() {
    productPresenter = ProductPresenter(
      this,
      ProductRepo(
        ProductRemoteDataSource(),
      ),
    );
  }

  bool circularindicator = false;
  Color circularColor;
  double circularOpacity;
  IProductPresenter productPresenter;
  AsyncSnapshot snapshotList;
  var _connectionStatus = 'Unknown';
  Connectivity connectivity;
  StreamSubscription<ConnectivityResult> subscription;
  ScrollController _scrollController = ScrollController();
  bool cupertinoProgress;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.orange,
        automaticallyImplyLeading: false,
        title: Text(
          'Product',
          style: TextStyle(color: Colors.white),
        ),
      ),
      body:
          StreamBuilder(
        stream: productPresenter.getProducts,

        builder: (context, AsyncSnapshot<ProductsList> snapshot) {
          if (snapshot.hasData) {
            return productListView(widget.myList);
          } else if (snapshot.hasError) {
            return Text(snapshot.error.toString());
          }
          return Center(
            child: Container(
              child: CircularProgressIndicator(),
            ),
          );
        },
      ),
    );

  }

  Future<Null> refreshList() async {
    await Future.delayed(Duration(seconds: 2));
    setState(() {});

    return null;
  }

  Widget productListView(List snapshot) {
    return RefreshIndicator(
      onRefresh: refreshList,
      child:
          ListView.builder(
        key: widget.key,
        controller: _scrollController,
        shrinkWrap: true,
        scrollDirection: Axis.vertical,
        itemBuilder: (BuildContext context, int index) {


          if(index+1 == widget.myList.length) {
            CupertinoActivityIndicator();
          }

          var plist = widget.myList[index];
          return GestureDetector(
            onTap: () => Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => ProductDetailScreen(
                  product: plist,
                ),
              ),
            ),
            child: Padding(
              padding: const EdgeInsets.all(8.0),
              child: Column(
                children: <Widget>[
                  Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Container(
                        width: 120,
                        height: 130,
                        child: Image(
                          image: NetworkImage(plist.image),
                        ),
                      ),
                      Container(
                        child: Flexible(
                          child: Padding(
                            padding: const EdgeInsets.all(8.0),
                            child: Column(
                              mainAxisAlignment: MainAxisAlignment.start,
                              crossAxisAlignment: CrossAxisAlignment.stretch,
                              children: <Widget>[
                                Text(
                                  plist.name,
                                  style: TextStyle(
                                    fontWeight: FontWeight.bold,
                                    fontSize: 16,
                                  ),
                                ),
                                Text(
                                  plist.description,
                                  softWrap: true,
                                  textAlign: TextAlign.left,
                                ),
                                SizedBox(
                                  height: 7,
                                ),
                                Row(
                                  children: <Widget>[
                                    Text(plist.price.toString(),
                                        style: TextStyle(
                                          fontWeight: FontWeight.bold,
                                          fontSize: 20,
                                        )),
                                    Spacer(),
                                    Text(plist.brand),
                                  ],
                                ),
                                TEProductIncrementor(
                                  product: plist,
                                ),
                                //TODO reverse it alse
                              ],
                            ),
                          ),
                        ),
                      ),
                    ],
                  ),
                  Row(
                    children: <Widget>[
                      Expanded(
                        child: Divider(
                          color: Colors.grey.shade300,
                        ),
                      ),
                    ],
                  )
                ],
              ),
            ),
          );
        },
        itemCount: widget.myList.length,
      ),
    );
  }

  productlist(BuildContext context, int index

  }

  @override
  hideProgress(ProductsList response) {

      setState(() {
        // Here you can write your code for open new view
        cupertinoProgress=false;
      });
    for (var c in response.products) {
      widget.myList.add(c);
    }
  }

  @override
  showError(String error) {
    // TODO: implement showError
    return null;
  }

  @override
  showProgress() {
    print('Successful');
    setState(() {
      cupertinoProgress=true;
    });
  }

  @override
  void initState() {
    super.initState();
    connectivity = new Connectivity();
    print('Init state called');
    print('Init state called');
    print('Init state called');
    subscription =
        connectivity.onConnectivityChanged.listen((ConnectivityResult result) {
      _connectionStatus = result.toString();
      print(_connectionStatus);
      if (result == ConnectivityResult.wifi ||
          result == ConnectivityResult.mobile) {
        widget.myList.isEmpty
            ? productPresenter.fetchProducts(widget._pageNumber.toString())
            :
                widget._pageNumber = widget._pageNumber + 1;
                productPresenter.fetchProducts(widget._pageNumber.toString(),);

        _scrollController.addListener(() {
          if (_scrollController.position.pixels ==
              _scrollController.position.maxScrollExtent) {
            widget._pageNumber = widget._pageNumber + 1;
            print(widget._pageNumber);
            productPresenter.fetchProducts(widget._pageNumber.toString(),);
          }
        });
      } else {
        showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              title: Center(
                child: Container(
                  child: Icon(
                    Icons.add_alert,
                    color: Colors.orange,
                    size: 20,
                  ),
                ),
              ),
              content: Text('Check your internet'),
              actions: <Widget>[
                new FlatButton(
                  child: new Text('Ok'),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
              ],
            );
          },
        );
      }
    });
  }

  @override
  void dispose() {
    subscription.cancel();
    super.dispose();
  }

  getMoreData() async {
  }

}

【问题讨论】:

标签: list flutter dart state


【解决方案1】:

您面临的主要问题是,每次用户滚动您所在的选项卡并返回到该选项卡时,应用程序都会再次重新获取数据。

您可以使用IndexedStack 使数据仅加载一次,因为您可以将代码编辑为这种方式。

class BaseScreenState extends State<BaseScreen> {

   List<Widget> _pages = [Page1(), Page2(), Page3()];

   @override
   Widget build(BuildContext context) {
      return Scaffold(
         body: IndexedStack(
                index: currentIndex,
                children: _pages,
               ),
      );
   }
}

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多