首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConnectionState在主类中更改了两次

问ConnectionState在主类中更改了两次
EN

Stack Overflow用户
提问于 2020-05-09 21:55:29
回答 1查看 39关注 0票数 1

我有这个应用程序,我有一个介绍屏幕,我想隐藏,如果用户已经跳过一次。我正在使用bloc和一个提供者。我的问题是,当我热重启应用程序时,连接状态会发生两次变化,我已经花了几个小时都不知道原因。

下面是我的代码:

我的主类

代码语言:javascript
复制
void main() => runApp(StatsApp());

class StatsApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => IntroProvider(),
        )
      ],
      child: Consumer<IntroProvider>(builder: (context, value, child) {
        return MaterialApp(
            home: FutureBuilder(
          future: value.bloc.checkSkipped(),
          builder: (BuildContext context, snapshot) {
            print(snapshot.connectionState);
            print(snapshot.data);
            return SplashScreen();
          },
        ));
      }),
    );
  }
}

我的区块

代码语言:javascript
复制
enum IntroEvents {
  ReadLocalStorage,
  SetIntroSkipped,
}

class IntroBloc extends Bloc<IntroEvents, bool> {
  PrefsManager _prefsManager = PrefsManager.instance;

  Future<bool> checkSkipped() async {
    this.add(IntroEvents.ReadLocalStorage);
    final skipped =
        await _prefsManager.getValue(PrefTypes.Bool, "skippedIntro");
    return skipped;
  }

  @override
  // TODO: implement initialState
  bool get initialState => false;

  @override
  Stream<bool> mapEventToState(IntroEvents event) async* {
    switch (event) {
      case IntroEvents.SetIntroSkipped:
        _prefsManager.setValue(PrefTypes.Bool, "skippedIntro", true);
        yield true;
        break;
      case IntroEvents.ReadLocalStorage:
        final skipped =
            await _prefsManager.getValue(PrefTypes.Bool, "skippedIntro");
        yield skipped;
        break;
      default:
        print("wtffffff");
    }
  }
}

我的提供者

代码语言:javascript
复制
class IntroProvider with ChangeNotifier {
  IntroBloc _bloc;

  IntroProvider(){
    print("called IntroProvider");
    _bloc = IntroBloc();
  }

  IntroBloc get bloc => _bloc;
}

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2020-05-09 22:02:26

在使用快照时,您可以检查snapshot.hasData。通常,当快照在if语句中有数据时,您会包装想要运行的功能,并在快照没有数据时提供某种默认的Widget。

代码语言:javascript
复制
FutureBuilder(
  future: value.bloc.checkSkipped(),
  builder: (BuildContext context, snapshot) {
    print(snapshot.connectionState);

    if (snapshot.hasData) {
      print(snapshot.data);
    }

    return SplashScreen();
  },
);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61697859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档