StreamBuilderを使い、外部と通信したデータを取得して画面に表示したいと考えています。
dart
1・・・・・ 2body: StreamBuilder( 3 stream: getList(), 4 builder: (BuildContext context, AsyncSnapshot<ResponseEventsGet> snapshot) { 5・・・・・
部分で、getList()で取得した値を受け取って表示したいと考えているのですが、
getList()の処理が終わり、returnで値が変えされる前に、builder部分の処理が開始され、値がないと判断されます。
getList()は、
dart
1 Stream<ResponseEventsGet> getList() { 2 // 初期設定:アプリID取得 3 var spDevice = new SpAccount(); 4 spDevice.getAccount(); 5 AccountEntity accountEntity = new AccountEntity(); 6 if (accountEntity.getUuid() == null) { 7 var userApiService = new UserApiService(); 8 userApiService.getUser(); 9 } 10 var eventsApiService = new EventsApiService(); 11 // イベント一覧取得 12 return Stream.fromFuture(eventsApiService.getEvents(10, 0)); 13 }
のような処理になっていて、最後の
dart
1Stream.fromFuture(eventsApiService.getEvents(10, 0));
で、別クラスのgetEventsが、最後まで実行できていることは、ログを出力して確認できているのですが、
その後、returnで値が返されることなく、builder部分に進んでしまいます。
dart
1Stream.fromFuture(eventsApiService.getEvents(10, 0)); 2```の前に、**await**をつけても変わりませんでした。 3 4正しく処理するにはどうすればいいのでしょうか? 5 6flutterの特性として、別クラスのメソッドを実行すると、スレッドが2つに分かれて同期的な処理ができなくなってしまうのでしょうか? 7 8ソースの全文は以下です。 9```dart 10import 'package:flutter/material.dart'; 11import 'package:openapi/api.dart'; 12import 'package:http/http.dart'; 13import 'package:time_counter_app/entity/AccountEntity.dart'; 14import 'package:time_counter_app/entity/DeviceInfoEntity.dart'; 15import 'package:time_counter_app/services/api/EventsApiService.dart'; 16import 'package:time_counter_app/services/api/UserApiService.dart'; 17import 'package:time_counter_app/storage/SpAccount.dart'; 18 19class EventListPage extends StatefulWidget { 20 const EventListPage({ 21 Key key, 22 }) : super(key: key); 23 24 25 _EventListPageState createState() => _EventListPageState(); 26} 27 28class _EventListPageState extends State<EventListPage> { 29 Future<ResponseEventsGet> eventList = null; 30 31 32 Widget build(BuildContext context) { 33 return Scaffold( 34 appBar: AppBar( 35 title: Text("イベント"), 36 automaticallyImplyLeading: false, 37 ), 38 body: StreamBuilder( 39 stream: getList(), 40 builder: (BuildContext context, AsyncSnapshot<ResponseEventsGet> snapshot) { 41 if (!snapshot.hasData) { 42 return Text("データを取得中"); 43 } 44 45 if (snapshot.data.totalCount == 0) { 46 return Text("データが存在しませんでした。"); 47 } 48 return ListView.builder( 49 shrinkWrap: true, 50 itemBuilder: (BuildContext context, int index) { 51 return Container( 52 decoration: BoxDecoration( 53 border: Border( 54 bottom: BorderSide(color: Colors.black38), 55 ), 56 ), 57 child: ListTile( 58 leading: const Icon(Icons.flight_land), 59 title: Text(snapshot.data.list[index].title), 60 subtitle: Text('2021/10/09 00:00:00'), 61 onTap: () { 62 Navigator.pushNamed(context, '/event_detail'); 63 }, 64 )); 65 }, 66 itemCount: snapshot.data.totalCount, 67 ); 68 }, 69 ), 70 floatingActionButton: FloatingActionButton( 71 child: Icon(Icons.add), 72 onPressed: () { 73 Navigator.pushNamed(context, '/event_register'); 74 }, 75 ), 76 ); 77 } 78 79 Stream<ResponseEventsGet> getList() { 80 // 初期設定:アプリID取得 81 var spDevice = new SpAccount(); 82 spDevice.getAccount(); 83 AccountEntity accountEntity = new AccountEntity(); 84 if (accountEntity.getUuid() == null) { 85 var userApiService = new UserApiService(); 86 userApiService.getUser(); 87 } 88 var eventsApiService = new EventsApiService(); 89 // イベント一覧取得 90 return Stream.fromFuture(eventsApiService.getEvents(10, 0)); 91 } 92} 93
dart
1import 'dart:convert'; 2 3import 'package:dio/dio.dart'; 4import 'package:openapi/api.dart'; 5import 'dart:io'; 6 7import 'package:time_counter_app/entity/AccountEntity.dart'; 8import 'package:time_counter_app/entity/DeviceInfoEntity.dart'; 9import 'package:time_counter_app/storage/SpAccount.dart'; 10 11class EventsApiService { 12 Future<ResponseEventsGet> getEvents(int limit, int offset) async { 13 DeviceInfoEntity deviceInfoEntity = new DeviceInfoEntity(); 14 AccountEntity accountEntity = new AccountEntity(); 15 16 var client = ApiClient(basePath: "http://10.0.2.2:31180"); 17 var eventsApi = EventsApi(client); 18 19 var response = await eventsApi.getEventsWithHttpInfo(Platform.operatingSystem, '1.0.0', 20 deviceInfoEntity.getOsVersion().toString(), accountEntity.getUuid(), accountEntity.getJwtKey(), 21 limit: limit, offset: offset); 22 if (response.statusCode == HttpStatus.unauthorized) { 23 // jwt取得 24 print("jwt取得"); 25 var userApi = UserApi(client); 26 RequestJwtKeyPost requestJwtKeyPost = new RequestJwtKeyPost(uuid: accountEntity.getUuid(), password: accountEntity.getPassword()); 27 ResponseJwtKeyPost responseJwtKeyPost = await userApi.postUserJwtKey( 28 Platform.operatingSystem, '1.0.0', deviceInfoEntity.getOsVersion(), 29 requestJwtKeyPost: requestJwtKeyPost); 30 var spDevice = new SpAccount(); 31 await spDevice.setJwtKey(responseJwtKeyPost.jwtKey); 32 accountEntity.setAccount('jwtKey', responseJwtKeyPost.jwtKey); 33 await getEvents(limit, offset); 34 } else if (response.body != null && response.statusCode != HttpStatus.noContent) { 35 ResponseEventsGet a = ResponseEventsGet.fromJson(jsonDecode(response.body)); 36 return a; 37 } 38 return Future<ResponseEventsGet>.value(null); 39 } 40} 41
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。