ScopedModel не обновляется при запуске приложения с помощью CupertinoTabScaffold - PullRequest
0 голосов
/ 30 марта 2020

У меня есть приложение Flutter, использующее CupertinoTabScaffold в качестве основной структуры.

Я пытаюсь обновить ScopedModel при инициализации приложения и соответствующим образом обновить CupertinoTabViews.

Желаемый результат: в приложении При запуске AppModel обновляется, а ProfilePage (внутри CupertinoTabView) получает обновленное значение isLogged.

Проблема в том, что функция loadData() правильно вызывается при запуске приложения, но значения не обновляются в представлениях.

У меня такое ощущение, что виджет ScopedModelDescendand не привязан к правильной модели.

Ниже приведен весь соответствующий код.

Это main.dart основной вызов

import 'package:trackarena_flutter/scoped_models/AppModel.dart';

void main() {
    WidgetsFlutterBinding.ensureInitialized();

    var model = new AppModel();

    model.loadData();

    runApp(MyApp())

}

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {

    return ScopedModel<AppModel>(
        model: AppModel(),
        child: MaterialApp(
          title: 'MyApp',
          home: HomePage(),
        )
    );
  }
}

AppModel.dart ScopedModel выглядит следующим образом:

class AppModel extends Model {
  bool _logged = false;
  User _user;

  void setUser(User user) {
    _user = user;
    _logged = true;
    notifyListeners();
  }

  User getUser() {
    return _user;
  }

  bool isLogged() {
    return _logged;
  }

  loadData() {

    User user = new User(
        id: "1",
        displayName: "michele",
    );

    setUser(user);

  }

}

Моя домашняя страница home.dart построитель имеет следующий вид:

@override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: _onBackPressed,
      child: CupertinoTabScaffold(
        controller: _tabController,
        tabBar: CupertinoTabBar(
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(
              icon: Icon(CupertinoIcons.home),
              title: Text('Home'),
            ),
            BottomNavigationBarItem(
              icon: Icon(CupertinoIcons.profile_circled),
              title: Text('Profile'),
            ),
            ),
          ],
        ),
        // ignore: missing_return
        tabBuilder: (context, index) {
          switch (index) {
            case 0:
              return CupertinoTabView(
                  navigatorKey: homeTabNavKey,
                  builder: (context) {
                    return CupertinoPageScaffold(
                      child: SearchPage(),
                    );
                  });
            case 1:
              return CupertinoTabView(
                  navigatorKey: profileTabNavKey,
                  builder: (context) {
                    return CupertinoPageScaffold(
                      child: ProfilePage(),
                    );
                  });
          }
        },
      ),
    );
  }

Наконец страница профиля profile.dart:

@override
  Widget build(BuildContext context) {
    size = Screen(MediaQuery.of(context).size);

    return Scaffold(
      body: AnnotatedRegion(
        child: SingleChildScrollView(
          child: Container(
            child: Column(
              children: <Widget>[
                ScopedModelDescendant<AppModel>(
                  builder: (BuildContext context, Widget child, AppModel model) {
                    return Text(model.isLogged().toString());
                  },
                )
              ]
            ),
          ),
        )
      ),
    );
  }


РЕДАКТИРОВАТЬ: Решено! Мне пришлось передать инстанцированную модель на MyApp. Ниже код main.dart


void main() {
    WidgetsFlutterBinding.ensureInitialized();

    var appModel = new AppModel();

    appModel.loadData();

    runApp(MyApp(model: appModel));

}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  final AppModel model;

  const MyApp({Key key, this.model}) : super(key: key);

@override
  Widget build(BuildContext context) {

    return ScopedModel<AppModel>(
        model: model,
        child: MaterialApp(
          title: 'MyApp',
          home: HomePage(),
        )
    );
  }

}

...