7

Providerフラッターアプリで使用していますが、新しいページに移動するとProvider、ページ 1 に提供されたデータにページ 2 でアクセスできません。

私が理解した方法Providerは、すべてのデータを格納する中央の場所があり、アプリケーションのどこからでもそのデータにアクセスできるということでした。したがって、以下に示す私のアプリケーションではToDoListManager、すべてのデータが保存される場所です。でデータを設定するとPage 1、 でそのデータにアクセスできPage 2、その逆も可能です。

これが正しくない場合、どの部分が間違っていますか? そして、なぜ私のアプリケーションで機能しないのですか?

これがコードです

ページ1

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      builder: (context) => ToDoListManager(),
      child: Scaffold(
        appBar: AppBar(
          title: Text('Cool Project'),
        ),
        body:e ToDoList(),
      ),
    );
  }
}

class ToDoList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final toDoListManager = Provider.of<ToDoListManager>(context);

    return ListView.builder(
      itemCount: toDoListManager.toDoList.length,
      itemBuilder: (context, index) {
        return GestureDetector(
          onTap: () {
            Navigator.push(context,
                MaterialPageRoute(builder: (context) => Details(index)));
          },
          child: Text(toDoListManager.toDoList[index]),
        );
      },
    );
  }
}

ページ2

class Details extends StatelessWidget {
  final int index;

  Details(this.index);

  @override
  build(BuildContext context) {
    return ChangeNotifierProvider(
      builder: (context) => ToDoListManager(),
      child: Scaffold(
          appBar: AppBar(
            title: Text('Details Bro'),
          ),
          body: AppBody(index)),
    );
  }
}

class AppBody extends StatelessWidget {
  final int index;

  AppBody(this.index);

  @override
  Widget build(BuildContext context) {
    final toDoListManager = Provider.of<ToDoListManager>(context);
    print(toDoListManager.toDoList);

    return Text(toDoListManager.toDoList[1]);
  }
}

ToDoListProvider

class ToDoListManager with ChangeNotifier {
  List<String> _toDoList = ['yo', 'bro'];

  List<String> get toDoList => _toDoList;

  set toDoList(List<String> newToDoList) {
    _toDoList = newToDoList;
    notifyListeners();
  }
}
4

1 に答える 1

6

次の 2 つのオプションがあります。

  1. どのルートからでもアクセスChangeNotifierProviderできるように、上に配置します。MaterialAppNavigator

  2. ウィジェットをそのまま保持しますが、元のマネージャーを提供Homeして新しいウィジェットをプッシュする場合。Navigator

onTap: () {
    Navigator.push(
        context,
        MaterialPageRoute(
            builder: (context) {
                return Provider<ToDoListManager>.value(
                    value: toDoListManager,
                    child: Details(index),
                );
            },
        ),
    );
},

ChangeNotifierProviderどちらのアプローチでも、詳細画面で新しいを作成する必要はありません。

于 2019-09-13T09:25:44.933 に答える