flutter - 跨多个页面持久化提供者数据不起作用

标签 flutter dart state-management flutter-provider

我正在使用 Provider在我的 Flutter 应用程序中,当我转到新页面时,数据提供给 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();
  }
}

最佳答案

您有 2 个选择:

  • 放置您的 ChangeNotifierProvider在您的上方 MaterialApp所以你们任何人都可以访问Navigator路线。
  • 保留您的 Home小部件原样但在使用 Navigator 推送新小部件时提供原经理。
  • onTap: () {
        Navigator.push(
            context,
            MaterialPageRoute(
                builder: (context) {
                    return Provider<ToDoListManager>.value(
                        value: toDoListManager,
                        child: Details(index),
                    );
                },
            ),
        );
    },
    

    使用这两种方法,您都不需要创建新的 ChangeNotifierProvider在您的详细信息屏幕中。

    关于flutter - 跨多个页面持久化提供者数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57910630/

    相关文章:

    flutter - 库 'package:flutter/material.dart' 是遗留库,不应导入到空安全库中

    flutter - 如何在 flutter 中实现暗模式

    android-studio - 在物理设备中运行时,Flutter 中的热重载不起作用

    flutter - Provider Widget 的放置位置——Flutter Provider Package

    flutter - 如何在Build Widget中使用Navigator进行重定向

    android - 如何在 Flutter 控制台中隐藏此消息 - ViewPostIme pointer 0

    Flutter状态管理-使用的架构

    c++ - 尝试在 C++ 中实现状态管理器时出现链接错误

    flutter - 异常 : The plugin firebase_admob could not be built due to the issue above

    flutter - 如何为flutter分配变量Navigator.push(context,variable);