问题描述
我想获得一些帮助。 我不明白为什么有些东西无法正确重建。 我有一个app.dart,它提供了所有商店,而Scafold的正文是主页,
class HomePage extends StatelessWidget {
const HomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<AuthStore>(
builder: (__,AuthStore authStore,_) {
debugPrint('--- $authStore');
return SafeArea(
child: authStore.authenticated
? const AuthenticatedScreen()
: const LoginScreen(),);
},);
}
}
登录屏幕完成其工作,并正确更新商店,我不明白为什么将身份验证更改为true后主屏幕没有更新 我尝试添加具有相同结果的观察者,例如无需重建
class HomePageStateless extends StatelessWidget {
const HomePageStateless({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<AuthStore>(builder: (__,_) {
debugPrint('--- $authStore');
return Observer(
builder: (_) => SafeArea(
child: authStore.authenticated
? const AuthenticatedScreen()
: const LoginScreen(),),);
});
}
}
我在这里缺少什么 而此小部件可以按预期工作
class HomePage extends StatefulWidget {
const HomePage({
Key key,}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
AuthStore _authStore;
final List<Reactiondisposer> _disposers = <Reactiondisposer>[];
bool _authenticated = false;
@override
void didChangeDependencies() {
super.didChangeDependencies();
for (Reactiondisposer disposer in _disposers) {
disposer();
}
_disposers.clear();
_authStore ??= Provider.of<AuthStore>(context);
_disposers.add(
autorun(
(_) {
print('home store $_authStore');
if (_authenticated != _authStore.authenticated) {
setState(() {
_authenticated = _authStore.authenticated;
});
}
},);
}
@override
void dispose() {
for (Reactiondisposer disposer in _disposers) {
disposer();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: _authenticated ? const AuthenticatedScreen() : const LoginScreen(),);
}
}
我知道这不是正确的方法,但是当商店发生变化时,自动运行始终会触发
解决方法
使用您要在状态和有状态的小部件下方的void方法中重建的内容,而不是无状态的小部件。