【问题标题】:Flutter - losing Provider state on hot reloadFlutter - 在热重载时失去提供者状态
【发布时间】:2020-08-22 03:55:40
【问题描述】:

当我热重载我的应用程序时,我失去了我的 Provider 类的状态。我知道 Provider 正确地保留了状态,所以我知道问题来自我的代码,但我无法弄清楚我哪里出错了。我有以下内容:


ma​​in.dart

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();
      }
    );
  }
}

root.dart

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();
        }
      },
    );
  }
}

core.dart

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()
      ]
    );
  }
}

我假设在某些时候我不应该重建或失去状态,我已经在已经存在的类似问题的帮助下尝试了很多事情,但我似乎无法解决它。

有什么想法吗? 非常感谢您的帮助。

干杯,

安迪

【问题讨论】:

    标签: flutter dart state flutter-provider hot-reload


    【解决方案1】:

    MultiProvider 包裹在 main.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
        ),
      ),
    ),
    

    【讨论】:

    • 稍后使用 userSnapshot.data 在 UserProvider 中设置您的数据
    • 是的,这行得通!谢谢。这是什么原因?是什么导致状态丢失?
    • 对不起,我不知道 :)
    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2020-07-28
    • 2020-09-13
    • 2021-09-11
    • 2020-05-23
    • 2020-06-15
    • 2020-03-29
    • 2020-02-06
    相关资源
    最近更新 更多