在PageView不同类中重建/刷新特定的窗口小部件

时间:2020-01-16 12:01:21

标签: flutter setstate

我有一个包含网页浏览量的主屏幕。该网页浏览量包含三个孩子,每个孩子都是一个单独的类:

children: <Widget>[
      FirstScreen(),
      SecondScreen(),
      ThirdScreen(),

这些屏幕从数据库加载数据,并且是StatefulWidgets。我从主屏幕上打开的单独屏幕中向该数据库添加数据。

将数据添加到数据库后,我想为这三个屏幕触发setState方法。

当它们处于不同的班级时,如何访问这些屏幕?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是状态管理。

有多种可能性可以确保业务逻辑/存储和小部件之间的通信。

https://flutter.dev/docs/development/data-and-backend/state-mgmt/options

我可以推荐BLoC和BlocProvider用于状态管理。简而言之,它使您的小部件可以对特定事件做出反应,在应用中声明状态并从视图中分离业务逻辑。

https://pub.dev/packages/flutter_bloc

答案 1 :(得分:0)

我添加了这个以显示示例,请为您的数据库修改它!

主屏幕

class MainScreen extends StatefulWidget {
  @override
  _MainScreenState createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  List<Map> list = [];

  @override
  void initState() {
    super.initState();
    list.add({'name': 'Raj', 'phone': '1234567890'});
    list.add(
      {'name': 'Naveen', 'phone': '1122334455'},
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          backgroundColor: Colors.black,
          title: Text('Main Screen', style: TextStyle(color: Colors.white)),
          actions: [
            IconButton(
                icon: Icon(Icons.add_circle, color: Colors.white),
                onPressed: () {
                  addNewItem();
                })
          ]),
      body: Container(
        padding:EdgeInsets.all(15),
          color: Colors.white,
          child: Center(
            child: ListView.builder(
                itemCount: list.length,
                itemBuilder: (con, ind) {
                  return ListTile(
                      title: Text(list[ind]['name'],
                          style: TextStyle(color: Colors.black)),
                      subtitle: Text(list[ind]['phone'],
                          style: TextStyle(color: Colors.black)));
                }),
          )),
    );
  }

  void addNewItem() async {
    Map newItem = await Navigator.push(
        context, MaterialPageRoute(builder: (cc) => NewScreen()));
    if (newItem != null) {
      setState(() {
        list.add(newItem);
      });
    }
  }
}

main pic 新屏幕

class NewScreen extends StatefulWidget {
  @override
  _NewScreenState createState() => _NewScreenState();
}

class _NewScreenState extends State<NewScreen> {
  //Declare your new item here....
  Map newItem;

  //I m using strigns, but use TextEditingControllers here...
  String name = '', phone = '';

  @override
  void initState() {
    super.initState();
    //database initialisation...
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: onBackPressed,
      child: Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.black,
          title: Text('New Screen', style: TextStyle(color: Colors.white)),),
        body: Container(
          padding:EdgeInsets.all(15),
          color:Colors.white,
            child: Center(
                child: Column(
          children: <Widget>[
            TextField(
                decoration: InputDecoration(labelText: 'Name',
                                           labelStyle: TextStyle(color: Colors.black)),
                onChanged: (v) {
                  setState(() {
                    name = v;
                  });
                },
            style: TextStyle(color: Colors.black)),
            TextField(
                decoration: InputDecoration(labelText: 'Phone',
                                           labelStyle: TextStyle(color: Colors.black)),
                onChanged: (v) {
                  setState(() {
                    phone = v;
                  });
                },
            style: TextStyle(color: Colors.black)),
            RaisedButton(
                child: Text('Add'),
                onPressed: () {
                  if (name.isNotEmpty && phone.isNotEmpty) {
                    newItem = Map();
                    newItem['name'] = name;
                    newItem['phone'] = phone;
                    //You may close new screen if you want !
                    //But call sendNewItemBack();
                  }
                })
          ],
        ))),
      ),
    );
  }

  Future<bool> onBackPressed() async {
    sendNewItemBack();
  }

  sendNewItemBack() {
    //add new item to database
    Navigator.of(context).pop(newItem);
  }
}

添加后

after pic