Flutter 更改通知提供程序文件';无法创建新的ChangeNotifier实例
我有平板电脑的母版详细信息页。Flutter 更改通知提供程序文件';无法创建新的ChangeNotifier实例,flutter,flutter-provider,flutter-change-notifier,Flutter,Flutter Provider,Flutter Change Notifier,我有平板电脑的母版详细信息页。 在列表中选择项目时,我想更改详细信息页面。 所以我写了这样的代码 class AttendancesModel with ChangeNotifier { final int userId; AttendancesModel(this.userId); List<Attendance> attendances = []; // do initialize } class AttendancesPage extends Statel
在列表中选择项目时,我想更改详细信息页面。
所以我写了这样的代码
class AttendancesModel with ChangeNotifier {
final int userId;
AttendancesModel(this.userId);
List<Attendance> attendances = [];
// do initialize
}
class AttendancesPage extends StatelessWidget {
final int userId;
AttendancesPage(this.userId);
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => AttendancesModel(userId),
child: Consumer(
builder: (_, model, __) {
print('model.userId=${model.userId}')
return Scaffold(
// appbar, body, etc...
);
}
)
);
}
}
带ChangeNotifier的课堂出席人数模型{
最终int用户标识;
AttendanceModel(this.userId);
名单出席人数=[];
//初始化
}
课堂出席视频扩展了无状态窗口小部件{
最终int用户标识;
AttendancesPage(this.userId);
@凌驾
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:()=>AttendanceModel(用户ID),
儿童:消费者(
建筑商:(uu,模型,uu){
打印('model.userId=${model.userId}')
返回脚手架(
//附件、主体等。。。
);
}
)
);
}
}
但是,生成器收到的模型值始终相同。因此,更改用户选择不会更改详细信息屏幕。
如何创建新模型 多谢各位 [编辑] 这样的UserListPage将通知用户选择
class UserListModel with ChangeNotifier {
List<User> users = [];
int _selectedUserId;
int get selectedUserId => _selectedUserId;
set selectedUserId(int userId) {
_selectedUserId = userId;
notifyListeners();
}
}
class UserListPage extends StatelessWidget {
Widget build(BuildContext context) {
return ChangeNotifierProvider.value(
value: Provider.of<UserListModel>(context),
child: Consumer(
builder: (_, model, __) {
return ListView.builder(
itemBuilder: (_, i) {
final user = model.users[i];
return ListTile(
title: Text(user.name),
onTap: () => model.selectedUserId = user.id,
);
},
itemCount: model.users.length
);
}
)
)
}
}
class HomePage extends StatelessWidget {
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => UserListModel(),
child: HomePageBody()
);
}
}
class HomePageBody extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: <Widget>[
SizedBox(width: 320, child: UserListPage()),
ChangeNotifierProvider.value(
value: Provider.of<UserListModel>(context),
child: Consumer<UserListModel>(
builder: (_, model, __) {
return AttendancePage(model.selectedUserId);
}
)
)
]
)
)
}
}
使用ChangeNotifier类UserListModel{
列出用户=[];
int _selectedUserId;
int get selectedUserId=>_selectedUserId;
设置selectedUserId(int userId){
_selectedUserId=userId;
notifyListeners();
}
}
类UserListPage扩展了无状态小部件{
小部件构建(构建上下文){
返回ChangeNotifierProvider.value(
value:Provider.of(上下文),
儿童:消费者(
建筑商:(uu,模型,uu){
返回ListView.builder(
itemBuilder:(u,i){
最终用户=模型用户[i];
返回列表块(
标题:文本(用户名),
onTap:()=>model.selectedUserId=user.id,
);
},
itemCount:model.users.length
);
}
)
)
}
}
类主页扩展了无状态小部件{
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:(\u)=>UserListModel(),
子项:HomePageBody()
);
}
}
类HomePageBody扩展了无状态小部件{
小部件构建(构建上下文){
返回脚手架(
正文:世界其他地区(
儿童:[
SizedBox(宽度:320,子项:UserListPage()),
ChangeNotifierProvider.value(
value:Provider.of(上下文),
儿童:消费者(
建筑商:(uu,模型,uu){
返回AttendancePage(型号:selectedUserId);
}
)
)
]
)
)
}
}
在AttendancesPage中,您传递的用户ID始终相同。为了理解,您想打印一些与用户ID相关的AttendanceModel信息,对吗
这是我做的。让我们看看它是否有用
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: HomePage(),
);
}
}
class User {
final int userId;
final String name;
User(this.userId, this.name);
}
class Attendance {
final int attendanceId;
final int userId;
final String data;
Attendance({
this.attendanceId,
this.data,
this.userId,
});
}
class UserListModel with ChangeNotifier {
List<User> users = [
User(15, "Rick"),
User(14, "Bob"),
User(12, "Lola"),
];
int _selectedUserId;
int get selectedUserId => _selectedUserId;
void changeSelectedUserId(int userId) {
_selectedUserId = userId;
print(_selectedUserId);
notifyListeners();
}
}
class UserListPage extends StatelessWidget {
Widget build(BuildContext context) {
return Consumer<UserListModel>(
builder: (_, model, __) {
return ListView.builder(
itemBuilder: (_, i) {
final user = model.users[i];
return ListTile(
title: Text(user.name),
onTap: () => model.changeSelectedUserId(user.userId),
);
},
itemCount: model.users.length);
},
);
}
}
class HomePage extends StatelessWidget {
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (_) => UserListModel(),
child: HomePageBody(),
);
}
}
class HomePageBody extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
body: Row(
children: <Widget>[
Expanded(child: UserListPage()),
Consumer<UserListModel>(
builder: (_, model, __) {
return Expanded(
child: ChangeNotifierProvider(
create: (_) => AttendancesModel(),
child: AttendancesPage(model.selectedUserId),
),
);
},
),
],
),
);
}
}
class AttendancesModel with ChangeNotifier {
List<Attendance> attendances = [
Attendance(attendanceId: 1, userId: 12, data: "Attendance1"),
Attendance(attendanceId: 2, userId: 15, data: "Attendance2"),
Attendance(attendanceId: 3, userId: 14, data: "Attendance3"),
];
Attendance findByUserId(int userId) {
return attendances.firstWhere((element) => element.userId == userId);
}
}
class AttendancesPage extends StatelessWidget {
final int userId;
AttendancesPage(this.userId);
@override
Widget build(BuildContext context) {
final attendance =
Provider.of<AttendancesModel>(context).findByUserId(userId);
return Scaffold(
body: Center(
child: Text(
"${attendance.attendanceId} - ${attendance.userId} - ${attendance.data}"),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:主页(),
);
}
}
类用户{
最终int用户标识;
最后的字符串名;
用户(this.userId,this.name);
}
课堂出勤率{
最后的国际出席;
最终int用户标识;
最终字符串数据;
出席({
这是艾登节,
这个数据,,
这个.userId,
});
}
使用ChangeNotifier类UserListModel{
列表用户=[
用户(15,“Rick”),
用户(14,“鲍勃”),
用户(12,“Lola”),
];
int _selectedUserId;
int get selectedUserId=>_selectedUserId;
void changeSelectedUserId(int userId){
_selectedUserId=userId;
打印(_选择序列号);
notifyListeners();
}
}
类UserListPage扩展了无状态小部件{
小部件构建(构建上下文){
退货消费者(
建筑商:(uu,模型,uu){
返回ListView.builder(
itemBuilder:(u,i){
最终用户=模型用户[i];
返回列表块(
标题:文本(用户名),
onTap:()=>model.changeSelectedUserId(user.userId),
);
},
itemCount:model.users.length);
},
);
}
}
类主页扩展了无状态小部件{
小部件构建(构建上下文){
返回ChangeNotifierProvider(
创建:(\u)=>UserListModel(),
子项:HomePageBody(),
);
}
}
类HomePageBody扩展了无状态小部件{
小部件构建(构建上下文){
返回脚手架(
正文:世界其他地区(
儿童:[
已展开(子项:UserListPage()),
消费者(
建筑商:(uu,模型,uu){
扩大回报(
子项:ChangeNotifierProvider(
创建:()=>AttendanceModel(),
儿童:AttendancesPage(型号:selectedUserId),
),
);
},
),
],
),
);
}
}
带ChangeNotifier的课堂出席人数模型{
名单出席人数=[
出席人数(attendanceId:1,用户ID:12,数据:“Attendance1”),
出席人数(attendanceId:2,用户ID:15,数据:“Attendance2”),
出席人数(attendanceId:3,用户ID:14,数据:“Attendance3”),
];
考勤findByUserId(int用户ID){
返回出席人数.firstWhere((element)=>element.userId==userId);
}
}
课堂出席视频扩展了无状态窗口小部件{
最终int用户标识;
AttendancesPage(this.userId);
@凌驾
小部件构建(构建上下文){
最后出席=
Provider.of(context.findByUserId(userId);
返回脚手架(
正文:中(
子:文本(
“${Attention.attendanceId}-${Attention.userId}-${Attention.data}”),
),
);
}
}
在AttendancesPage中,您传递的用户ID始终相同。为了便于理解,您需要在AttendanceModel上打印一些信息