Flutter:使用底部导航栏中的Stream Builder重新渲染ListView时出现问题

时间:2019-06-08 09:18:39

标签: flutter dart

使用流构建器在列表视图中显示数据时出现问题,当选项卡处于活动状态时,列表视图总是重新加载。 我正在实施AutomaticKeepAliveClientMixin,但是仍然无法正常工作。

这是我的代码:

家庭底部导航: https://pastebin.com/B9qf0zZR

列表视图索引:

import 'package:eservice_f/src/blocs/listDataBloc.dart';
import 'package:eservice_f/src/models/listModel.dart';
import 'package:eservice_f/utils/layout.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class ServiceIndex extends StatefulWidget {
  ServiceIndex({Key key}) : super(key: key);

  _ServiceIndexState createState() => _ServiceIndexState();
}

class _ServiceIndexState extends State<ServiceIndex> with AutomaticKeepAliveClientMixin<ServiceIndex>{
  ListDataBloc _bloc;

  @override
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _bloc = ListDataBloc();
    _bloc.showAllData();
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    //bloclist.dispose();
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Container(
      child: StreamBuilder(
          stream: _bloc.allData,
          builder: (context, AsyncSnapshot<ListData> snapshot) {
            print(snapshot.data);
            if (snapshot.hasData) {
              return Container(
                color: Colors.white,
                child: Center(
                  child: getServiceList(context, snapshot),
                ),
              );
            } else if (snapshot.hasError) {
              return Text(snapshot.error.toString());
            }
            return Container(
                color: Colors.white,
                child: Center(child: CupertinoActivityIndicator()));
          }),
    );
  }

  Widget getServiceList(
      BuildContext context, AsyncSnapshot<ListData> snapshot) {
    SizeConfig().init(context);
    var _list_data = snapshot.data.data;
    return ListView.builder(
        itemCount: _list_data.length,
        itemBuilder: (BuildContext contex, int index) {
          return Column(
            children: <Widget>[
              ListTile(
                onTap: () {
                  print("List Tapped");
                },
                leading: Column(
                  children: <Widget>[
                    Icon(
                      Icons.check_circle_outline,
                      size: SizeConfig.blocHorizontal * 10,
                    ),
                  ],
                ),
                title: Text("SBG/LK/20180814"),
                subtitle: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Text('SusSystem Update Training MEX',
                        overflow: TextOverflow.ellipsis),
                    Text(
                        'So basically you building a Facebook/Instagram like application, where user logs in, scrolls through their feed, stalks through different profiles, and when done, wants to log out of the app',
                        overflow: TextOverflow.ellipsis),
                  ],
                ),
                trailing: (_list_data[index].activityStatus == "1")
                    ? Text("Draft")
                    : Text("Confirm"),
              ),
              Divider(
                height: 1.0,
              ),
            ],
          );
        });
  }
}

集团:

import 'package:eservice_f/src/models/listModel.dart';
import 'package:eservice_f/src/resources/repository.dart';
import 'package:rxdart/rxdart.dart';

class ListDataBloc{
   final _repository = Repository();
   final _fetcher = PublishSubject<ListData>();
   Observable<ListData> get allData => _fetcher.stream;

   showAllData() async{
     ListData datas = await _repository.fetchAll();

     _fetcher.sink.add(datas);
   }

   dispose(){
     _fetcher.close();
   }
 }

 //initial Bloc
 //final bloclist = ListDataBloc();

0 个答案:

没有答案