Перестроить / обновить sh конкретный c виджет в PageView другого класса - PullRequest
0 голосов
/ 16 января 2020

У меня есть главный экран, содержащий просмотр страницы. У просмотра страницы есть три дочерних элемента, каждый из которых является отдельным классом:

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

. Эти экраны загружают данные из базы данных и представляют собой StatefulWidgets. Я добавляю данные в эту базу данных из отдельного экрана, который я открываю на главном экране.

Я хочу активировать метод setState для этих трех экранов после добавления данных в базу данных.

Как получить доступ к этим экранам, когда они относятся к другому классу?

Ответы [ 2 ]

1 голос
/ 16 января 2020

Что вам нужно, так это управление состоянием.

Существуют различные возможности для обеспечения связи между бизнес-логи c / хранилищами и виджетами.

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

Я могу рекомендовать BLo C и BlocProvider для управления состоянием. Проще говоря, он позволяет вашим виджетам реагировать на определенные события, изменения состояния в вашем приложении и отделяет бизнес-логи c от представлений.

https://pub.dev/packages/flutter_bloc

0 голосов
/ 17 января 2020

Я добавил это, чтобы показать пример, измените его для своей базы данных!

Главный экран

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

...