1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Flutter】子Widgetの再描画が動かない

Posted at

bottomNavigationBarを使っている画面で、画面再描画がうまく機能しなかった件の対応方法です。

##元の状態

親ページはbottomNavigationBarでの画面切り替えを行っており、bodyを_pageListで切り替えています。

  List<Widget> _pageList = [];
  @override
  void initState() {
    super.initState();
   _pageList = [
      PageA(),
      PageB(),
      PageC()
    ];
  }

この状態でPageB()で表示しているDBを親ページ側で更新します。
そこでsetState()しても親ページの再描画は行われますが、子WidgetのPageBは再描画されません。

##対応方法

StatefulWidgetのKeyを使います。こういう使い方ができるんですね。
まだ良くわかっていませんが、今回はGlobalKeyを使いました。

まず子Widgetの方。Keyを受け取ります。

class PageB extends StatefulWidget {
  PageB({Key? key}) : super(key: key);

  @override
  _PageBState createState() => _PageBState();
}

親ページ。GlobalKeyを作成します。

 GlobalKey _key = GlobalKey<State<PageB>>();

_keyを引数で渡します。

   _pageList = [
      CampListPage(),
      MyGearListPage(key: _key),
      SettingPage()
    ];

子WidgetのsetState()を実行

_key.currentState?.setState(() {});

これで子Widgetが再描画されました。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?