質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

1035閲覧

StreamBuilderのstreamから値を返す前に、Widgetのメイン処理が実行され、値がないと処理されてしまう

murapon

総合スコア22

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2021/11/26 00:18

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

EventsApiServiceに、

await getEvents(limit, offset);

という再帰処理を入れてたのですが、これがあると正しく動作しませんでした。
これを削除し、

dart

1response = await eventsApi.getEventsWithHttpInfo(Platform.operatingSystem, '1.0.0', 2 deviceInfoEntity.getOsVersion().toString(), accountEntity.getUuid(), accountEntity.getJwtKey(), 3 limit: limit, offset: offset); 4var a = ResponseEventsGet.fromJson(jsonDecode(response.body)); 5return a;

に変えたらうまくいきました。
再起処理だとなぜダメだったかはわからないですが、一旦先に進みました。

投稿2021/11/27 02:09

murapon

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問