跨多个页面保留提供程序数据不起作用
Persist Provider data across multiple pages not working
我在我的 flutter 应用程序中使用 Provider
,当我转到新页面时,第 1 页提供给 Provider
的数据在第 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 应用程序中使用 Provider
,当我转到新页面时,第 1 页提供给 Provider
的数据在第 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
。