Mam AppBar(), który znajduje się w menu szuflady, która wywołuje wszystkie strony w mojej aplikacji (obecnie używam tej zależności - https://pub.dev/packages/drawerbehavior)

void main() => runApp(NavigatorMenu());

class NavigatorMenu extends StatefulWidget {
  @override
  _NavigatorMenuState createState() => _NavigatorMenuState();
}

class _NavigatorMenuState extends State<NavigatorMenu> {
   int selectedNavigatorMenuItemId;
      DrawerScaffoldController controller = DrawerScaffoldController();
     
      @override
      Widget build(BuildContext context) {
        return DrawerScaffold(
          controller: controller,
          appBar: AppBar
            actions: <Widget>[
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Row(
                    children: <Widget>[
                      Text(pointsText.toString()),
                    ],
                  ),
                ],
              ),
            ],
          drawers: [
            SideDrawer(
              percentage: 0.6,
              menu: menu,
              selectedItemId: selectedNavigatorMenuItemId,
              onMenuItemSelected: (itemId) {
                setState(() {
                  selectedNavigatorMenuItemId = itemId;
                });
              },
            ),
          ],
          builder: (context, id) => IndexedStack(index: id, children: <Widget>[
            Home(),
          ]),
        );
      }
}

Chcę zaktualizować pointsText, który jest zdefiniowany na całym świecie w moim {x1}}, ale jako AppBar jest zdefiniowany w innym StatefulWidget nie zaktualizowałby UI mojej aplikacji.

int pointsText;

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ListView(
            children: <Widget>[
              RaisedButton(
                onPressed: () {
                  setState(() {
                    pointsText++;
                  });
                },
                child: Text('Update UI'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
0
Arnav 29 lipiec 2020, 13:18

1 odpowiedź

Najlepsza odpowiedź

Zadeklarować funkcję w _NavigatorMenuState, która otrzymała wartość z widgetu domowego

  int appBarValue;
  void updateAppBar(int value) {
                setState(() {
                      appBarValue = value;
                  });
  }

Przekazać tę metodę widgetu domowego

Home(updateAppBar),

Użyj wartości appbarwalue w AppBar

Text(appBarValue.toString()),

Wreszcie, dajcie to wywoływać się z ekranu głównego.

int pointsText;

class Home extends StatefulWidget {
  final _updateAppBar;
  Home(this._updateAppBar);


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

class _HomeState extends State<Home> {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: ListView(
            children: <Widget>[
              RaisedButton(
                onPressed: () {
                  setState(() {
                    pointsText++;
                    widget._updateAppBar(pointsText);
                  });
                },
                child: Text('Update UI'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
1
Jitesh Mohite 29 lipiec 2020, 10:51