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

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

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

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

解決済

flutter ListViewのエラーについて (Null check operator used on a null value)

OSARU_2020
OSARU_2020

総合スコア15

Flutter

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

1回答

0リアクション

0クリップ

277閲覧

投稿2022/08/12 05:49

解決したいこと

FutureBuilderの中でListViewを使って、リストを表示したいが上手くいきません。

発生しているエラー

表示されるはずのリストが表示されず、画面が真っ白になってしまいます。
エラーメッセージの上部を見ていると、ListViewのwidgetが悪さをしてそうな印象です。

↓エラーメッセージ全文

======== Exception caught by widgets library ======================================================= The following _CastError was thrown building NotificationListener<KeepAliveNotification>: Null check operator used on a null value The relevant error-causing widget was: ListView ListView:file:///Users/satoruyamano/AndroidStudioProjects/funandpractise/lib/ui/bbs/feed_bbs.dart:102:41 When the exception was thrown, this was the stack: ==================================================================================================== 文字数がオーバーするため一部省略

該当のソースコード

↓悪さをしてそうな箇所を抜粋したコード(この下に全コードも記載します)

Dart

FutureBuilder( future: futureData, builder: ((context, snapshot) { if (snapshot.hasError) { return Center( child: Text( snapshot.error.toString(), style: const TextStyle(color: Colors.black), )); } else if (snapshot.hasData) { return ListView.builder( itemCount: (snapshot.data as List<BBSPost>).length, itemBuilder: ((context, index) { BBSPost post = (snapshot.data as List<BBSPost>)[index]; return BBSFeedWidget(post: [post]); }), ); } return Center( child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation( Theme.of(context).primaryColor))); }), ),

↓全文

Dart

class BBSFeedPage extends StatefulWidget { const BBSFeedPage({Key? key}) : super(key: key); State<BBSFeedPage> createState() => _BBSFeedPage(); } class _BBSFeedPage extends State<BBSFeedPage> { late Future<List<BBSPost>> futureData; Future<List<BBSPost>> readData() async { PostgrestResponse<dynamic> res = await Supabase.instance.client .from('bbs_view') .select() .order('created_at', ascending: false) .execute(); return (res.data as List<dynamic>).map((e) => BBSPost.fromMap(e)).toList(); } void initState() { super.initState(); futureData = readData(); } Widget build(BuildContext context) { return Scaffold( backgroundColor: Theme.of(context).bottomAppBarColor, key: _scaffoldKey, body: SafeArea( child: DefaultTabController( length: 2, child: NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return <Widget>[ //TODO:ーーーーーーーーーーーーーーーーーーーーーーーーーーーーSliverAppBar SliverAppBar( backgroundColor: Theme.of(context).bottomAppBarColor, floating: true, pinned: false, snap: false, leading: IconButton( icon: const Icon(Icons.menu), color: Theme.of(context).iconTheme.color, onPressed: () async { _scaffoldKey.currentState?.openDrawer(); }), forceElevated: true, expandedHeight: 50, automaticallyImplyLeading: false, ), _tabSection(), ]; }, //TODO:ーーーーーーーーーーーーーーーーーーーーーーーーーーーーBody body: TabBarView( children: [ FutureBuilder( future: futureData, builder: ((context, snapshot) { if (snapshot.hasError) { return Center( child: Text( snapshot.error.toString(), style: const TextStyle(color: Colors.black), )); } else if (snapshot.hasData) { return ListView.builder( itemCount: (snapshot.data as List<BBSPost>).length, itemBuilder: ((context, index) { BBSPost post = (snapshot.data as List<BBSPost>)[index]; return BBSFeedWidget(post: [post]); }), ); } return Center( child: CircularProgressIndicator( valueColor: AlwaysStoppedAnimation( Theme.of(context).primaryColor))); }), ), ], ), ), ), ), //TODO:ーーーーーーーーーーーーーーーーーーーーーーーーーーーー親スレッド作成ボタン floatingActionButton: FloatingActionButton( backgroundColor: Theme.of(context).primaryColor, onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => const AddBBSPage(), fullscreenDialog: true, //fullscreenDialog: true, ), ); }, child: Icon(FeatherIcons.plus, color: Theme.of(context).bottomAppBarColor), ), ); } } //TODO:ーーーーーーーーーーーーーーーーーーーーーーーーーーーーTabBar Widget _tabSection() { return const SliverPersistentHeader( pinned: true, delegate: _StickyTabBarDelegate( tabBar: TabBar( labelColor: Colors.black, tabs: [ Tab( text: 'フォロー', ), Tab( text: '新着スレッド', ) ], ), ), ); } //TODO:ーーーーーーーーーーーーーーーーーーーーーーーーーーーーSliverPersistentHeaderDelegateを継承したTabBarを作る class _StickyTabBarDelegate extends SliverPersistentHeaderDelegate { const _StickyTabBarDelegate({required this.tabBar}); final TabBar tabBar; double get minExtent => tabBar.preferredSize.height; double get maxExtent => tabBar.preferredSize.height; Widget build( BuildContext context, double shrinkOffset, bool overlapsContent, ) { return Material( elevation: 1, child: Container( color: Theme.of(context).bottomAppBarColor, child: tabBar, ), ); } bool shouldRebuild(_StickyTabBarDelegate oldDelegate) { return tabBar != oldDelegate.tabBar; } } class BBSPost { BBSPost({ required this.postID, required this.title, required this.text, required this.purpose, required this.categoryID, required this.idol, required this.createdAt, required this.username, required this.avatar_url, required this.likednum, required this.avatar_initial, //required this.commentnum, }); final int postID; final String title; final String text; final String purpose; final int categoryID; final String idol; final DateTime createdAt; final String? username; final String? avatar_url; final int? likednum; final String avatar_initial; factory BBSPost.fromMap(Map<String, dynamic> map) { return BBSPost( postID: map['post_id'], title: map['title'], text: map['text'], purpose: map['purpose_name'], categoryID: map['category_id'], idol: map['idol_name'], createdAt: DateTime.parse(map['created_at']), username: map['username'], avatar_url: map['avatar_url'], likednum: map['likednum'], avatar_initial: map['avatar_initial'], ); } }

試したこと

  • flutter upgrade を試してみる

※原因を検索して色々試したものの、クリティカルな対処法を発見できず、上記以外で特に記載できるようなことは試せていません。

補足情報

AndroidStudioでコーディングしています。
flutterのバージョンは最新です。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Flutter

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