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

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

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

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

Dart

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

1372閲覧

flutterの非同期処理の結果をwidgetに表示できない

退会済みユーザー

退会済みユーザー

総合スコア0

Flutter

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

Dart

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/12/28 00:09

編集2021/12/28 01:35

こちらの記事やこちらに記事を見ながらAPIで取得した情報を表示させようとしたのですが画面に結果が表示されません。コピペしてそのままやってもダメでriverpodを1系に変えてもダメでした。

おそらく非同期処理で先にwidgetが更新されその後にhttp通信が行われているため表示されないのだと思われるのですが,どうすればいいのでしょうか?
view.dart

dart

1class _Articles extends HookConsumerWidget { 2 3 Widget build(BuildContext context, WidgetRef ref) { 4 final viewModel = ref.watch(articleViewModel.notifier); 5 final aState = ref.watch(articleViewModel.notifier).state; 6 print(aState); 7 8 return RefreshIndicator( 9 onRefresh: () async { 10 print(aState); 11 await viewModel.refreshArticles(); 12 }, 13 child: 14 ListView.builder( 15 itemCount: aState.articles.length, 16 itemBuilder: (context, int index) { 17 if (index == (aState.articles.length - 1) && aState.hasNext) { 18 viewModel.getArticles(); 19 return const LinearProgressIndicator(); 20 } 21 return _articleItem(context, aState.articles[index]); 22 }, 23 ), 24 ); 25 } 26 27 Widget _articleItem(context, article) { 28 return GestureDetector( 29 child: Container( 30 padding: const EdgeInsets.all(15.0), 31 decoration: const BoxDecoration( 32 border: Border( 33 bottom: BorderSide( 34 color: Color(0x1e333333), 35 width: 1, 36 ), 37 ), 38 ), 39 child: Column( 40 crossAxisAlignment: CrossAxisAlignment.start, 41 children: <Widget>[ 42 _articleUser(article.user), 43 const SizedBox( 44 height: 10.0, 45 ), 46 Text(article.title), 47 const SizedBox( 48 height: 10.0, 49 ), 50 Wrap( 51 spacing: 7.5, 52 children: <Widget>[ 53 for (int i = 0; i < article.tags.length; i++) 54 _articleTag(article.tags[i]) 55 ], 56 ), 57 const SizedBox( 58 height: 5.0, 59 ), 60 _articleCreatedAt(article.createdAt), 61 ], 62 ), 63 ), 64 onTap: () { 65 Navigator.of(context).push( 66 MaterialPageRoute( 67 builder: (context) => ArticleDetailPage( 68 article: article, 69 ), 70 ), 71 ); 72 }, 73 ); 74 } 75 76 Widget _articleUser(user) { 77 final userId = user.id; 78 return Row( 79 children: [ 80 CircleAvatar( 81 backgroundImage: NetworkImage(user.profileImageUrl), 82 radius: 12.0, 83 child: const Text(''), 84 ), 85 const SizedBox(width: 8.0), 86 Text('@$userId'), 87 ], 88 ); 89 } 90 91 Widget _articleTag(tag) { 92 return GestureDetector( 93 child: Text( 94 tag['name'], 95 style: const TextStyle( 96 decoration: TextDecoration.underline, 97 ), 98 ), 99 onTap: () { 100 // ignore: avoid_print 101 print(tag['name']); 102 }, 103 ); 104 } 105 106 Widget _articleCreatedAt(createdAt) { 107 DateFormat format = DateFormat('yyyy-MM-dd'); 108 String date = format.format(DateTime.parse(createdAt).toLocal()); 109 110 return SizedBox( 111 width: double.infinity, 112 child: Text( 113 '$dateに投稿', 114 textAlign: TextAlign.right, 115 ), 116 ); 117 } 118} 119

viewmodel.dart

dart

1final articleViewModel = StateNotifierProvider( 2 (_) => ArticleViewModel( 3 ArticleRepository(), 4 ), 5); 6 7class ArticleViewModel extends StateNotifier<ArticlesState> { 8 ArticleViewModel(this.repository) : super(const ArticlesState()) { 9 getArticles(); 10 } 11 12 final ArticleRepository repository; 13 14 int _page = 1; 15 bool _isLoading = false; 16 17 Future<void> getArticles() async { 18 if (_isLoading || !state.hasNext) { 19 return; 20 } 21 22 _isLoading = true; 23 24 final articles = await repository.fetchArticles(_page, state.keyword); 25 // print(articles); 26 final newArticles = [...state.articles, ...articles]; 27 // print(newArticles); 28 29 if (articles.length % 20 != 0 || articles.length == 0) { 30 state = state.copyWith( 31 hasNext: false, 32 ); 33 } 34 35 state = state.copyWith( 36 articles: newArticles, 37 ); 38 // print(state); 39 print(_isLoading); 40 _page++; 41 _isLoading = false; 42 print(_isLoading); 43 } 44 45 Future<void> setQuery(String keyword) async { 46 state = state.copyWith( 47 articles: [], 48 keyword: keyword, 49 hasNext: true, 50 ); 51 52 _page = 1; 53 } 54 55 Future<void> refreshArticles() async { 56 state = state.copyWith( 57 articles: [], 58 hasNext: true, 59 ); 60 61 _page = 1; 62 63 getArticles(); 64 } 65} 66

viewmodelのapiはprintで出力されていました

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

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

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

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

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

y_waiwai

2021/12/28 00:56

コードを提示しよう 質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問