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上打印一些信息