flutterでデータを取得しListViewで表示するというものをBlocパターンで作製しているのですが、sink.addのタイミングでデバッグで止めると値は取れているのですが、streambuilder内でhasDataがfalseになってしまいます。
どこが原因なのでしょうか?
構造はTabBarScreen -> Screenになっていてその中でListViewを表示しようとしています。
Providerはここで噛ませています。
TabBarScreen.dart
1lass TabInfo { 2 String label; 3 Widget widget; 4 TabInfo(this.label, this.widget); 5} 6 7class TabBarScreen extends StatelessWidget { 8 final List<TabInfo> _tabs = [ 9 TabInfo( 10 "CARDS", 11 CardBlocProvider( 12 key: PageStorageKey<String>("key_card_screen"), 13 bloc: CardBloc(), 14 child: CardsScreen(), 15 ), 16 //... 17 ) 18 ]; 19 20 @override 21 Widget build(BuildContext context) { 22 return DefaultTabController( 23 length: _tabs.length, 24 child: Scaffold( 25 appBar: AppBar( 26 leading: new Container(), 27 title: Text(""), 28 bottom: TabBar( 29 isScrollable: true, 30 tabs: _tabs.map((TabInfo tab) { 31 return Tab(text: tab.label); 32 }).toList(), 33 ), 34 ), 35 36 body: TabBarView(children: _tabs.map((tab) => tab.widget).toList()), 37 ) 38 ); 39 } 40}
CardsScreen.dart
1class CardsScreen extends StatefulWidget { 2 CardsScreen({Key key, this.title}) : super(key: key); 3 final String title; 4 5 @override 6 _CardsScreenState createState() => new _CardsScreenState(); 7} 8 9class _CardsScreenState extends State<CardsScreen> with AutomaticKeepAliveClientMixin<CardsScreen>{ 10 TextEditingController editingController = TextEditingController(); 11 12 //... 13 14 @override 15 Widget build(BuildContext context) { 16 var bloc = CardBlocProvider.of(context); 17 18 var searchView = TextField( 19 //... 20 ); 21 22 var stream = StreamBuilder( 23 stream: bloc.cardsInitialStream, 24 builder: (context, snap) { 25 //ここでsnap.hasDataがfalseになってしまうためロードのままになってしまう。 26 if(!snap.hasData) return LinearProgressIndicator(); 27 28 return ListView.builder( 29 itemBuilder: (BuildContext context, int index){ 30 return Container( 31 child:ListTile( 32 //... 33 ), 34 ); 35 }, 36 itemCount: snap.data.list.length, 37 ); 38 }); 39 40 var contentBody = Container( 41 child: Column( 42 children: <Widget>[ 43 Padding( 44 padding: const EdgeInsets.all(8.0), 45 child: stream 46 ), 47 ], 48 ), 49 ); 50 51 return Scaffold( 52 body: contentBody, 53 floatingActionButton: _createFloationgActionButton(), 54 ); 55 }
sink.addのタイミングではデバッグでデータが渡ってきているが、streamで見るタイミングではhasDataはfalseになってしまう。
class CardBloc { final _cardsInitialPublishSubject = PublishSubject<CardListModel>(); CardBloc() { fetchCards(); } Stream<CardListModel> get cardsInitialStream => _cardsInitialPublishSubject.stream; Sink<CardListModel> get cardsInitialSink => _cardsInitialPublishSubject.sink; void fetchCards() async { final _cardsResponse = await CardRepository().fetchCardRepository(); //ここをデバッグで見ると<CardListModel>のデータが渡ってきているが、Streamではデータが無いとなってしまう。 cardsInitialSink.add(_cardsResponse); } void dispose() { _cardsInitialPublishSubject.close(); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/05 11:05
2020/04/05 01:00
2020/04/20 06:18
2020/04/24 10:53