Flutter 颤振:使用具有嵌套类的提供程序更新小部件
我正在使用并且试图在ChangeNotifierProvider的嵌套对象下调用一个方法后更新我的小部件(在飞机中嵌套的座椅中调用updateColor() 如中所述,我尝试使用ChangeNotifierProxyProvider,但没有成功 调用updateColor()时,如何确保小部件得到更新 代码示例:Flutter 颤振:使用具有嵌套类的提供程序更新小部件,flutter,flutter-provider,Flutter,Flutter Provider,我正在使用并且试图在ChangeNotifierProvider的嵌套对象下调用一个方法后更新我的小部件(在飞机中嵌套的座椅中调用updateColor() 如中所述,我尝试使用ChangeNotifierProxyProvider,但没有成功 调用updateColor()时,如何确保小部件得到更新 代码示例: import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; main() {
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
main() {
runApp(MultiProvider(providers: [
ChangeNotifierProvider<Aircraft>(create: (_) => Aircraft()),
], child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Consumer<Aircraft>(builder: (context, aircraft, _) {
return Column(
children: <Widget>[
Text('${aircraft.aircraftManufacturer.toString()}'),
Text('${aircraft.emptyWeight}'),
Text('${aircraft.length}'),
Column(
children: aircraft.seats.entries.map((seat) {
return Text(
'Row ${seat.key} is Class: ${seat.value.seatClass.toString()}, '
+ 'emergencyExitSeat: ${seat.value.emergencyExitSeat.toString()}, '
+ ' emergencyExitSeat: ${seat.value.seatColor.toString()},');
}).toList()),
Column(
children: aircraft.seats.entries.map((seat) {
return RaisedButton(
onPressed: () => seat.value.updateColor(),
child: Text('Change color for ${seat.key}'),
);
}).toList())
],
);
}),
),
),
);
}
}
enum Manufacturer { Airbus, Boeing, Embraer }
enum SeatClass { First, Business, Economy }
class Aircraft extends ChangeNotifier {
Manufacturer _aircraftManufacturer;
double _emptyWeight;
double _length;
Map<int, Seat> _seats;
Manufacturer get aircraftManufacturer => _aircraftManufacturer;
double get emptyWeight => _emptyWeight;
double get length => _length;
Map<int, Seat> get seats => _seats;
Aircraft() {
_aircraftManufacturer = Manufacturer.Airbus;
_emptyWeight = 190.0;
_length = 66.80;
_seats = new Map<int, Seat>();
_seats.putIfAbsent(
1, () => new Seat(SeatClass.First, false, Color(0xFF42A5F5)));
_seats.putIfAbsent(
2, () => new Seat(SeatClass.Business, false, Color(0xFF42A4F5)));
_seats.putIfAbsent(
3, () => new Seat(SeatClass.Economy, false, Color(0xFF42A3F5)));
_seats.putIfAbsent(
4, () => new Seat(SeatClass.Economy, true, Color(0xFF42A2F5)));
}
}
class Seat extends ChangeNotifier {
SeatClass _seatClass;
bool _emergencyExitSeat;
Color _seatColor;
Seat(SeatClass seatClass, bool emergencyExitSeat, Color seatColor) {
_seatClass = seatClass;
_emergencyExitSeat = emergencyExitSeat;
_seatColor = seatColor;
}
SeatClass get seatClass => _seatClass;
bool get emergencyExitSeat => _emergencyExitSeat;
Color get seatColor => _seatColor;
void updateColor() {
_seatColor = Color(0xFF9EB26E);
print('Color updated');
notifyListeners();
}
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
main(){
runApp(多供应商)(供应商:[
ChangeNotifierProvider(创建:()=>Aircraft()),
],child:MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(上下文){
返回材料PP(
家:脚手架(
正文:中(
子项:消费者(构建者:(上下文、飞机等){
返回列(
儿童:[
文本(“${aircraft.aircraftManufacturer.toString()}”),
文本(“${airpair.emptyWeight}”),
文本(“${airpair.length}”),
纵队(
儿童:飞机。座位。条目。地图((座位){
返回文本(
'行${seat.key}是类:${seat.value.seatClass.toString()},'
+'EmergencyExitSet:${seat.value.EmergencyExitSet.toString()},'
+'EmergencyExitSet:${seat.value.seatColor.toString()}';
}).toList()),
纵队(
儿童:飞机。座位。条目。地图((座位){
返回上升按钮(
按下时:()=>seat.value.updateColor(),
子项:文本(${seat.key}的更改颜色),
);
}).toList())
],
);
}),
),
),
);
}
}
枚举制造商{空客、波音、巴西航空工业公司}
enum SeatClass{First,Business,Economy}
类飞机更改通知程序{
制造商-飞机制造商;
双倍空重;
双倍长度;
地图座位;
制造商获得飞机制造商=>\u飞机制造商;
double-get-emptyWeight=>\u-emptyWeight;
double get length=>\u length;
Map get seats=>\u seats;
飞机(){
_飞机制造商=制造商。空客;
_空重=190.0;
_长度=66.80;
_座位=新地图();
_席位,席位,席位(
1,()=>新座椅(SeatClass.First,假,彩色(0xFF42A5F5));
_席位,席位,席位(
2,()=>新座椅(SeatClass.Business,假,彩色(0xFF42A4F5));
_席位,席位,席位(
3,()=>新座椅(SeatClass.Economy,假,彩色(0xFF42A3F5));
_席位,席位,席位(
4,()=>新座椅(SeatClass.Economy,真彩色(0xFF42A2F5));
}
}
类通知程序{
SeatClass\u SeatClass;
bool_紧急出口;
颜色(seatColor);;
座椅(座椅类座椅类、bool紧急出口座椅、彩色座椅颜色){
_seatClass=seatClass;
_EmergencyExitSet=EmergencyExitSet;
_seatColor=seatColor;
}
SeatClass获取SeatClass=>\u SeatClass;
bool get emergencyExitSeat=>\u emergencyExitSeat;
颜色获取seatColor=>\u seatColor;
void updateColor(){
_座椅颜色=颜色(0xFF9EB26E);
打印(“颜色更新”);
notifyListeners();
}
}
为什么您要让座椅也成为一个更改通知程序
,它不需要直接通知听众,因为它是嵌套的并且在飞机
内部创建的,因此,您只需将飞机
制作成一个更改通知程序
,并在座椅
内提供一种方法来更改颜色(一个设置程序
就足够了):
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
main(){
runApp(多供应商)(供应商:[
ChangeNotifierProvider(创建:()=>Aircraft()),
],child:MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(上下文){
返回材料PP(
家:脚手架(
正文:中(
子项:消费者(构建者:(上下文、飞机等){
返回列(
儿童:[
文本(“${aircraft.aircraftManufacturer.toString()}”),
文本(“${airpair.emptyWeight}”),
文本(“${airpair.length}”),
纵队(
儿童:飞机。座位。条目。地图((座位){
返回文本(
'行${seat.key}是类:${seat.value.seatClass.toString()},'
+'EmergencyExitSet:${seat.value.EmergencyExitSet.toString()},'
+'EmergencyExitSet:${seat.value.seatColor.toString()}';
}).toList()),
纵队(
儿童:飞机。座位。条目。地图((座位){
返回上升按钮(
按下:()=>aircraft.onSeatColorUpdate(seat.value),
子项:文本(${seat.key}的更改颜色),
);
}).toList())
],
);
}),
),
),
);
}
}
枚举制造商{空客、波音、巴西航空工业公司}
enum SeatClass{First,Business,Economy}
类飞机更改通知程序{
制造商-飞机制造商;
双倍空重;
双倍长度;
地图座位;
制造商获得飞机制造商=>\u飞机制造商;
double-get-emptyWeight=>\u-emptyWeight;
double get length=>\u length;
Map get seats=>\u seats;
飞机(){
_飞机制造商=制造商。空客;
_空重=190.0;
_长度=66.80;
_座位=新地图();
_席位,席位,席位(
1,()=>新座椅(SeatClass.First,假,彩色(0xFF42A5F5));
_席位,席位,席位(
2,()=>新座椅(SeatClass.Business,假,彩色(0xFF42A4F5));
_席位,席位,席位(
3,()=>新座椅(SeatClass.Economy,false,Co
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
main() {
runApp(MultiProvider(providers: [
ChangeNotifierProvider<Aircraft>(create: (_) => Aircraft()),
], child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Consumer<Aircraft>(builder: (context, aircraft, _) {
return Column(
children: <Widget>[
Text('${aircraft.aircraftManufacturer.toString()}'),
Text('${aircraft.emptyWeight}'),
Text('${aircraft.length}'),
Column(
children: aircraft.seats.entries.map((seat) {
return Text(
'Row ${seat.key} is Class: ${seat.value.seatClass.toString()}, '
+ 'emergencyExitSeat: ${seat.value.emergencyExitSeat.toString()}, '
+ ' emergencyExitSeat: ${seat.value.seatColor.toString()},');
}).toList()),
Column(
children: aircraft.seats.entries.map((seat) {
return RaisedButton(
onPressed: () => aircraft.onSeatColorUpdate(seat.value),
child: Text('Change color for ${seat.key}'),
);
}).toList())
],
);
}),
),
),
);
}
}
enum Manufacturer { Airbus, Boeing, Embraer }
enum SeatClass { First, Business, Economy }
class Aircraft extends ChangeNotifier {
Manufacturer _aircraftManufacturer;
double _emptyWeight;
double _length;
Map<int, Seat> _seats;
Manufacturer get aircraftManufacturer => _aircraftManufacturer;
double get emptyWeight => _emptyWeight;
double get length => _length;
Map<int, Seat> get seats => _seats;
Aircraft() {
_aircraftManufacturer = Manufacturer.Airbus;
_emptyWeight = 190.0;
_length = 66.80;
_seats = new Map<int, Seat>();
_seats.putIfAbsent(
1, () => new Seat(SeatClass.First, false, Color(0xFF42A5F5)));
_seats.putIfAbsent(
2, () => new Seat(SeatClass.Business, false, Color(0xFF42A4F5)));
_seats.putIfAbsent(
3, () => new Seat(SeatClass.Economy, false, Color(0xFF42A3F5)));
_seats.putIfAbsent(
4, () => new Seat(SeatClass.Economy, true, Color(0xFF42A2F5)));
}
void onSeatColorUpdate(Seat seat){//you should edit this method to accept color as parameter
seat.updateColor();//you should edit this method to accept color as parameter
notifyListeners();
}
}
class Seat {
SeatClass _seatClass;
bool _emergencyExitSeat;
Color _seatColor;
Seat(SeatClass seatClass, bool emergencyExitSeat, Color seatColor) {
_seatClass = seatClass;
_emergencyExitSeat = emergencyExitSeat;
_seatColor = seatColor;
}
SeatClass get seatClass => _seatClass;
bool get emergencyExitSeat => _emergencyExitSeat;
Color get seatColor => _seatColor;
void updateColor() {
_seatColor = Color(0xFF9EB26E);
print('updateColor in class seat');
}
}