flutter 抖动-热重新加载时丢失提供器状态

3qpi33ja  于 2023-03-04  发布在  Flutter
关注(0)|答案(2)|浏览(93)

当我热重载应用时,我丢失了Provider类的状态。我知道Provider正确地保留了状态,所以我知道问题来自我的代码,但我无法找出哪里出错了。

    • 主省道**
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: GlobalData.fetchTheme(),
      builder: (BuildContext context, AsyncSnapshot<String> themeSnapshot) {
        if (themeSnapshot.hasData) {
          GlobalData.theme = themeSnapshot.data;
          return Phoenix(
            child: MaterialApp(
              title: 'MyApp',
              home: Scaffold(body: Root()),
              theme: ThemeData(
                accentColor: Palette.green
              ),
            )
          );
        }
        return Loading();
      }
    );
  }
}
    • 根.省道**
class Root extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamBuilder<FirebaseUser>(
      stream: FireAuth().getInstance().onAuthStateChanged,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.active) {
          FirebaseUser user = snapshot.data;
          if (user != null) {
            GlobalData.setUid(user.uid);
          }
          return user == null ? Auth() : SafeArea(child: KeyboardDismisser(child: Core()));
        } else {
          return Loading();
        }
      },
    );
  }
}
    • 型芯省道**
class Core extends StatelessWidget {
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        FutureBuilder(
          future: Users.getUser(GlobalData.uid),
          builder: (BuildContext context, AsyncSnapshot<TuneUser> userSnapshot) {
            if (userSnapshot.hasData) {
              return MultiProvider(
                providers: [
                  ChangeNotifierProvider(create: (context) => UserProvider(userSnapshot.data)),
                  ChangeNotifierProvider(create: (context) => SearchProvider()),
                  ChangeNotifierProvider(create: (context) => DetailsProvider()),
                ],
                child: Expanded(child: BottomBarNavigation())
              );
            }
            return Expanded(child: Loading());
          }
        ),
        BottomBar()
      ]
    );
  }
}

我假设在某个时候我正在重建或失去状态,而我不应该这样做,我已经尝试了很多事情的帮助下,类似的问题已经存在,但我似乎不能解决它。
有什么主意吗?我会很感激你的帮助。
干杯,
安迪

lkaoscv7

lkaoscv71#

把你包裹在主.dart里

MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (context) => UserProvider(userSnapshot.data)),
    ChangeNotifierProvider(create: (context) => SearchProvider()),
    ChangeNotifierProvider(create: (context) => DetailsProvider()),
  ],
  child: child: MaterialApp(
    title: 'MyApp',
    home: Scaffold(body: Root()),
    theme: ThemeData(
      accentColor: Palette.green
    ),
  ),
),
wko9yo5t

wko9yo5t2#

使用MultiProvider类是不够的。您需要按如下方式注册提供程序:

ChangeNotifierProvider(create: (context) => User())

不是这样的

ChangeNotifierProvider.value(value: User())

相关问题