web-dev-qa-db-ja.com

プロバイダのコンテキストを見つけることの問題をひらひら

私はフラッタープロバイダーパターンに問題があります。ユーザーが新しい画面にリダイレクトされた後、プロバイダが見つかりませんでした。

私の前の質問に続いて( このウィジェットの上に正しいプロバイダーが見つかりませんでした )このコードを書きました:

class NewRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final title = 'Tap to select';
    return MaterialApp(
        title: title,
        home: Scaffold(
          appBar: AppBar(
            title: Text(title),
          ),
          body: NewRouteBody()
        ));
  }
}

class NewRouteBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var user = Provider.of<UserRepository>(context);
    return ListView(...)
 _

私は同じことをしましたが、このウィジェットの上の正しいプロバイダが見つからなかったと言っているというエラーがあります(NewRouteBody)。

どういうわけかそれを修正しようとした、数時間の答えが成功せずに答えを描くことを試みました...

あらゆる助けが高く評価されています。

[〜#〜]編集[〜#〜]

これはパターンを含むUserRepositoryです。

class UserRepository with ChangeNotifier {
  User user;
  Status _status = Status.Uninitialized;

  Status get status => _status;
  User get getUser => user;
...}
 _

編集2:

Changenotifierを使用したコードスニペット:

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<UserRepository>(
      builder: (context) => UserRepository.instance(),
      child: Consumer<UserRepository>(
        builder: (context, UserRepository userRepository, _) {
          switch (userRepository.status) {
            case Status.Uninitialized:
              return Login();
            case Status.Unauthenticated:
              return Login();
            case Status.Authenticating:
            case Status.Authenticated:

              if(userRepository.getUser.isPrefSet == 0){
                return Selection();
              }
              return Dashboard();
          }
        },
      ),
    );
  }
}
 _
7
harunB10

あなたは最初にプロバイダーを作成し、そしてその木の中に使い方を上に置く必要があります。たとえば、あなたの場合:

  Widget build(BuildContext context) {
final title = 'Tap to select';
return MaterialApp(
    title: title,
    home: Scaffold(
        appBar: AppBar(
          title: Text(title),
        ),
        body: Provider<UserRepository> (
          builder: (context) => UserRepository(),
            dispose: (context, val) => val.dispose(),
            child: NewRouteBody())
    ));
 _

}

2
MozesM