У меня есть приложение 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(),
)
);
}
}