yamada0088
@yamada0088

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【Flutter】providerのnotifyListeners()でshowModalBottomSheetを再描画させたいのですができません。

解決したいこと

Flutterの勉強で、メモ帳アプリを作成しています。
そこでshowModalBottomSheetWidgetをproviderのnotifyListeners()で再描画させたいのですができません。
何が足りないのでしょうか?
よければアドバイスいただけるとありがたいです。
よろしくお願いします。

詳細

Buttonを押すとshowModalBottomSheetが表示され、そこに新規メモ帳作成Buttonと今までに作成した下書きのメモ帳が動的に表示させる、といった機能を実装しようといています。
しかし、新規メモ帳作成Buttonを押し、メモ帳作成画面へ移動したあとにメモ内容を保存し、「 Navigator.pop(context);」により戻るとnotifyListeners()が実行されても画面が再描画されません。

該当するソースコード

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class SendDiary extends StatefulWidget {
  String? destination;
  SendDiary(this.destination);

  @override
  State<SendDiary> createState() => _SendDiary();
}

class _SendDiary extends State<SendDiary> {
  @override
  Widget build(BuildContext context) {
    final double deviceHeight = MediaQuery.of(context).size.height;
    final double deviceWdth = MediaQuery.of(context).size.width;
    return Scaffold(
        body: TextButton(
      onPressed: () {
        showModalBottomSheet(
            isScrollControlled: true,
            context: context,
            enableDrag: true,
            builder: (context) {
              return Consumer<ReShowModalBottomSheet>(
                  builder: (context, model, child) {
                return Container(
                    height: deviceHeight * 0.4,
                    width: deviceWdth,
                    child: Column(children: [
                      TextButton(
//ここでメモ帳作成画面へ遷移
                        onPressed: () async {
                          await Navigator.push(
                              context,
                              MaterialPageRoute(
                                  builder: (context) => WriteDiary(null)));
//メモ帳作成後、戻ってきたタイミングで再描画
                          model.reShowModalBottomSheet();
                        },
                        child: Text('新規メモ帳作成画面へ遷移'),
                      ),
                      SingleChildScrollView(
                          physics: BouncingScrollPhysics(),
                          child: Column(children: [
                            for (int index = 0;
                                index < diaryStorage[0].length;
                                index++) ...{
                              // new Consumer<ReShowModalBottomSheet>(
                              //     builder: (context, model, child) {
                              new TextButton(
                                onPressed: () async {
//ここで保存していたメモ帳(下書き)をメモ帳作成画面へ展開
                                  await Navigator.push(
                                      context,
                                      MaterialPageRoute(
                                          builder: (context) => SendWriteDiary(
                                                null,
                                                null,
                                                null,
                                                'null',
                                                null,
                                              )));
//メモ帳作成画面から戻り、画面再描画
                                       model.reShowModalBottomSheet();
                                },
                                child: Text('下書きの数だけButtonを作成'),
                              )
                            }
                          ]))
                    ]));
              });
            });
      },
      child: Text('ShowModalBottomSheet'),
    ));
  }
}
import 'package:flutter/material.dart';

class ReShowModalBottomSheet extends ChangeNotifier {
  void reShowModalBottomSheet() {
    notifyListeners();
  }
}

自分で試したこと

Consumerでラップするところを色々変えたり、widgetを「new」して作成してみたりなど。

0

No Answers yet.

Your answer might help someone💌