【问题标题】:How to update Map from another class via button press如何通过按下按钮从另一个类更新地图
【发布时间】:2021-08-10 21:42:43
【问题描述】:

我在屏幕上有一些基于地图内容动态呈现的小部件。我已经通过一个文本字段更新了地图的内容,并且它一直运行良好,直到我决定将此文本字段移动到一个单独的类/屏幕。如何从这个单独的屏幕正确调用 setState 并在我返回时反映我的更新?

顺便说一句,我花了很多时间试图研究这个问题,但除了可能需要使用回调函数之外,我似乎无法解决任何问题?

NoteSection 是从提醒地图动态呈现的

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

final Map<String, String> reminders = {};

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Note App'),
      ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => AddNoteScreen(),
            ),
          );
        },
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          NoteSection(),
        ],
      ),
    );
  }
}

我正在更新地图的屏幕代码如下

class AddNoteScreen extends StatefulWidget {
  @override
  _AddNoteScreenState createState() => _AddNoteScreenState();
}

final titleController = TextEditingController();
final bodyController = TextEditingController();

String noteBodyText = bodyController.text;
String noteTitleText = titleController.text;

class _AddNoteScreenState extends State<AddNoteScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Note App'),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          titleTextField,
          bodyTextField,
          Container(
            padding: EdgeInsets.only(
              right: 10,
              bottom: 10,
            ),
            child: ElevatedButton(
              style: ElevatedButton.styleFrom(
                primary: Colors.amber,
              ),
              child: Text(
                'Add Note',
                style: TextStyle(color: Colors.white),
              ),
              onPressed: () {
                setState(() {
                  noteTitleText = titleController.text;
                  noteBodyText = bodyController.text;
                  reminders[noteTitleText] = noteBodyText;
                  titleController.clear();
                  bodyController.clear();
                  Navigator.pop(context);
                });
              },
            ),
          ),
        ],
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart callback widget


    【解决方案1】:

    这行得通

    class MyHomePage extends StatefulWidget {
          @override
          _MyHomePageState createState() => _MyHomePageState();
        }
        
        final Map<String, String> reminders = {};
        List<String> _information = [];
        
        class _MyHomePageState extends State<MyHomePage> {
       
    
            void updateInformation(List<String> information) {
            setState(() => reminders[information[0]] = information[1]);
          }
        void moveToSecondPage() async {
            List<String> information = await Navigator.push(
              context,
              MaterialPageRoute(
                  fullscreenDialog: true, builder: (context) => AddNoteScreen()),
            );
            updateInformation(information);
           
          }
          @override
          Widget build(BuildContext context) {
            return Scaffold(
              appBar: AppBar(
                title: Text('Note App'),
              ),
              floatingActionButton: FloatingActionButton(
                child: Icon(Icons.add),
                onPressed: () {
                   moveToSecondPage();
                },
              ),
              body: Column(
                crossAxisAlignment: CrossAxisAlignment.end,
                children: [
                  NoteSection(),
                ],
              ),
            );
          }
        }
    

    添加笔记屏幕

    class AddNoteScreen extends StatefulWidget {
      @override
      _AddNoteScreenState createState() => _AddNoteScreenState();
    }
    
    final titleController = TextEditingController();
    final bodyController = TextEditingController();
    
    String noteBodyText = bodyController.text;
    String noteTitleText = titleController.text;
    
    class _AddNoteScreenState extends State<AddNoteScreen> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Note App'),
          ),
          body: Column(
            crossAxisAlignment: CrossAxisAlignment.end,
            children: [
              titleTextField,
              bodyTextField,
              Container(
                padding: EdgeInsets.only(
                  right: 10,
                  bottom: 10,
                ),
                child: ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    primary: Colors.amber,
                  ),
                  child: Text(
                    'Add Note',
                    style: TextStyle(color: Colors.white),
                  ),
                  onPressed: () {
                   
                      noteTitleText = titleController.text;
                      noteBodyText = bodyController.text;
                     
                      Navigator.pop(context,[noteTitleText,noteBodyText]);
                    
                  },
                ),
              ),
            ],
          ),
        );
      }
    }
    

    了解更多请访问passing data when popping view in flutter

    【讨论】:

      【解决方案2】:

      您应该通过构造函数将 noteBodyText 传递给 myhomepage statefull 小部件,以便您的 myHomePage 看起来像这样

      class MyHomePage extends StatefulWidget {
      String noteBodyText;
      MyHomePage({this.noteBodyText});
        
        @override
        _MyHomePageState createState() => _MyHomePageState();
      }
      
      
      final Map<String, String> reminders = {};
      
      class _MyHomePageState extends State<MyHomePage> {
      void initState(){
        reminders[noteTitleText] = widget.noteBodyText;
      }
      
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            appBar: AppBar(
              title: Text('Note App'),
            ),
            floatingActionButton: FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => AddNoteScreen(),
                  ),
                );
              },
            ),
            body: Column(
              crossAxisAlignment: CrossAxisAlignment.end,
              children: [
                NoteSection(),
              ],
            ),
          );
        
      
      }
      }
      

      addnotescreen 应该是这样的

      class AddNoteScreen extends StatefulWidget {
        @override
        _AddNoteScreenState createState() => _AddNoteScreenState();
      }
      
      final titleController = TextEditingController();
      final bodyController = TextEditingController();
      
      String noteBodyText = bodyController.text;
      String noteTitleText = titleController.text;
      
      class _AddNoteScreenState extends State<AddNoteScreen> {
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            appBar: AppBar(
              title: Text('Note App'),
            ),
            body: Column(
              crossAxisAlignment: CrossAxisAlignment.end,
              children: [
                titleTextField,
                bodyTextField,
                Container(
                  padding: EdgeInsets.only(
                    right: 10,
                    bottom: 10,
                  ),
                  child: ElevatedButton(
                    style: ElevatedButton.styleFrom(
                      primary: Colors.amber,
                    ),
                    child: Text(
                      'Add Note',
                      style: TextStyle(color: Colors.white),
                    ),
                    onPressed: () {
                      
                        noteTitleText = titleController.text;
                        noteBodyText = bodyController.text;
                        
                        
                        Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => MyHomePage(noteBodyText:noteBodyText),
              ),
            );
                     
                    },
                  ),
                ),
              ],
            ),
          );
        }
      }
      

      【讨论】:

      • 您好,感谢您的回复,无论如何我可以使用 Navigator.pop 获得相同的结果吗?
      • 是的,你可以试试我的第二篇文章,如果你遇到任何问题,请告诉我
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2020-09-22
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多