Flutter 如何在Flatter中使用provider或valuenotifier在modalbottomsheet和父屏幕之间传递数据
我的自定义底页如下:Flutter 如何在Flatter中使用provider或valuenotifier在modalbottomsheet和父屏幕之间传递数据,flutter,provider,Flutter,Provider,我的自定义底页如下: Future<PersistentBottomSheetController?> _init(BuildContext context) async { return showModalBottomSheet( context: context, isDismissible: isDismissable, enableDrag: canDragToClose, isScrollControlled: isS
Future<PersistentBottomSheetController?> _init(BuildContext context) async {
return showModalBottomSheet(
context: context,
isDismissible: isDismissable,
enableDrag: canDragToClose,
isScrollControlled: isScrollable,
builder: (_) {
if (_isDraggble) {
return DraggableScrollableSheet(
initialChildSize: initialChildSize,
maxChildSize: maxChildSize,
minChildSize: minChildSize,
builder: (context, scrollController) {
return body(context, controller: scrollController);
},
);
}
return WillPopScope(
onWillPop: () async => canPop,
child: body(context),
);
},
);
}
Future\u init(BuildContext上下文)异步{
返回showModalBottomSheet(
上下文:上下文,
isDismissable:isDismissable,
enableDrag:canDragToClose,
IsCrollControlled:IsCrollable,
建筑商:(){
如果(_isDraggble){
返回DragableScrollableSheet(
initialChildSize:initialChildSize,
maxChildSize:maxChildSize,
minChildSize:minChildSize,
生成器:(上下文,滚动控制器){
返回主体(上下文、控制器:scrollController);
},
);
}
返回式示波器(
onWillPop:()异步=>canPop,
儿童:身体(上下文),
);
},
);
}
我使用以下代码打开工作表:
class StoryNameAndAccessLevel extends StatelessWidget {
const StoryNameAndAccessLevel({
Key? key,
required this.scaler,
required this.title,
}) : super(key: key);
final HwScaleUtil scaler;
final String title;
@override
Widget build(BuildContext context) {
ValueNotifier<AccessRole> _selectedItem = ValueNotifier(AccessRole.NoRole);
return ValueListenableBuilder(
valueListenable: _selectedItem,
builder: (context, AccessRole value, child) {
return Padding(
padding: scaler.insets.symmetric(vertical: 1),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
HwText(
title,
style: HwTextStyle.header55,
),
GestureDetector(
onTap: () {
HwBottomModal.draggable(
ctx: context,
builder: (controller) =>
SetCustomAccessLevel(controller, title),
initialChildSize: .65,
);
},
child: HwText(
value == AccessRole.NoRole
? 'set access level'
: returnRole(value),
style:
HwTextStyle.subTitle.copyWith(color: Color(0xff00a7b4)),
),
)
],
),
);
});
}
}
String returnRole(AccessRole role) {
if (role == AccessRole.Admin) return 'Admin';
if (role == AccessRole.Manager) return 'Manager';
if (role == AccessRole.ViewOnly) return 'View only';
if (role == AccessRole.NoAccess) return 'No access';
return 'set access level';
}
类故事名和访问级别扩展了无状态小部件{
常量故事名和访问级别({
钥匙?,钥匙,
需要这个.scaler,
需要这个标题,
}):super(key:key);
最终HwScaleUtil定标器;
最后的字符串标题;
@凌驾
小部件构建(构建上下文){
ValueNotifier _selectedItem=ValueNotifier(AccessRole.NoRole);
返回值ListenableBuilder(
valueListenable:\u selectedItem,
生成器:(上下文、AccessRole值、子级){
返回填充(
填充:缩放。插入。对称(垂直:1),
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
HwText(
标题
样式:HwTextStyle.header55,
),
手势检测器(
onTap:(){
可拖动的(
ctx:上下文,
生成器:(控制器)=>
SetCustomAccessLevel(控制器、标题),
初始大小:.65,
);
},
子:HwText(
值==AccessRole.NoRole
?“设置访问级别”
:返回角色(值),
风格:
HwTextStyle.subTitle.copyWith(颜色:颜色(0xff00a7b4)),
),
)
],
),
);
});
}
}
字符串返回角色(AccessRole角色){
if(role==AccessRole.Admin)返回“Admin”;
if(role==AccessRole.Manager)返回“Manager”;
如果(role==AccessRole.ViewOnly)返回'View only';
if(role==AccessRole.NoAccess)返回'No access';
返回“设置访问级别”;
}
该类将在以下屏幕中使用:
class CustomAccess extends StatelessWidget {
@override
Widget build(BuildContext context) {
final model = context.watch<StoryState>();
final scaler = context.scaler;
return ValueListenableBuilder<Future<List<Story>>?>(
valueListenable: model.storiesRef,
builder: (context, future, child) {
return FutureBuilder<List<Story>>(
future: future,
builder: (context, task) {
if (task.connectionState == ConnectionState.waiting)
return AppSpinner();
if (task.hasError) {
return DashboardErrorState.noTitle(
subTitle: parseError(
task.error,
"We could not fetch your stories at this time, due to an error",
),
onRetry: () {
model.refreshstories();
},
);
}
if (!task.hasData || (task.data?.isEmpty ?? true)) return child!;
return RefreshIndicator(
child: CustomScrollView(
shrinkWrap: true,
slivers: [
SliverPadding(
padding:
scaler.insets.symmetric(horizontal: 0, vertical: 2),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(_, index) {
return StoryNameAndAccessLevel(
scaler: scaler,
title:
'${task.data![index].name},
);
},
childCount: task.data?.length ?? 0,
),
),
),
],
),
onRefresh: () async {
model.refreshstories();
},
);
},
);
},
child: const StoryEmptyState(),
);
}
}
class CustomAccess扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终模型=context.watch();
final scaler=context.scaler;
返回值ListenableBuilder(
valueListenable:model.storiesRef,
构建者:(上下文、未来、子对象){
回归未来建设者(
未来:未来,,
生成器:(上下文、任务){
if(task.connectionState==connectionState.waiting)
返回AppSpinner();
if(task.hasError){
返回DashboardErrorState.noTitle(
字幕:语法错误(
task.error,
“由于出现错误,我们此时无法获取您的故事”,
),
onRetry:(){
model.refreshstories();
},
);
}
如果(!task.hasData | |(task.data?.isEmpty??true))返回子项!;
返回刷新指示器(
子:自定义滚动视图(
收缩膜:对,
条子:[
填缝料(
衬垫:
缩放器。插入。对称(水平:0,垂直:2),
银条:银条列表(
代表:SliverChildBuilderDelegate(
(),索引){
返回故事名和访问级别(
缩放器:缩放器,
标题:
'${task.data![index].name},
);
},
childCount:task.data?长度为0,
),
),
),
],
),
onRefresh:()异步{
model.refreshstories();
},
);
},
);
},
子级:常量StoryEmptyState(),
);
}
}
最后,我的小部件在底部打开
class SetCustomAccessLevel extends StatelessWidget {
final ScrollController controller;
ValueNotifier<AccessRole> _selectedItem = ValueNotifier(AccessRole.NoRole);
final _scaffoldKey = GlobalKey<ScaffoldState>();
String title;
SetCustomAccessLevel(this.controller, this.title);
List<CustomRadioTile> _userAccessRole = [
CustomRadioTile(
title: 'Admin',
subtitle:
'Full access to managing stories.',
selectedItem: AccessRole.Admin,
),
CustomRadioTile(
title: 'Manager',
subtitle:
'Limited editing access ',
selectedItem: AccessRole.Manager,
),
CustomRadioTile(
title: 'View Only',
subtitle:
'Can view but cannot edit ',
selectedItem: AccessRole.ViewOnly,
),
CustomRadioTile(
title: 'No Access',
selectedItem: AccessRole.NoAccess,
),
];
@override
Widget build(BuildContext context) {
return Scaffold(
key: _scaffoldKey,
appBar: HwAppBar(
title: 'Set Access Level',
implyLeading: false,
actions: [
IconButton(
icon: SvgPicture.asset(
HwSvgs.closeIcon,
),
onPressed: () {
Navigator.pop(context, _selectedItem);
},
),
],
),
body: ListView(
children: [
Center(
child: HwText(
title,
style: HwTextStyle.black.copyWith(
fontSize: 56,
color: HwColors.black,
fontWeight: FontWeight.bold),
),
),
ValueListenableBuilder(
valueListenable: _selectedItem,
builder: (context, AccessRole value, child) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
child: ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: _userAccessRole.length,
itemBuilder: (context, index) {
return Column(
children: [
HwSizedBox(
height: 3,
),
InkWell(
onTap: () {
_selectedItem.value =
_userAccessRole[index].selectedItem;
},
child: Container(
decoration: BoxDecoration(),
child: CustomRadioTile(
selectedItem:
_userAccessRole[index].selectedItem,
radio: value ==
_userAccessRole[index].selectedItem
? SvgPicture.asset(HwSvgs.radioCheck)
: SvgPicture.asset(
HwSvgs.unActiveRadioButton),
title: _userAccessRole[index].title,
subtitle: _userAccessRole[index].subtitle,
),
),
),
],
);
},
),
),
);
}),
],
));
}
}
class SetCustomAccessLevel扩展了无状态小部件{
最终滚动控制器;
ValueNotifier _selectedItem=ValueNotifier(AccessRole.NoRole);
最终_scaffoldKey=GlobalKey();
字符串标题;
SetCustomAccessLevel(this.controller,this.title);
列表_userAccessRole=[
定制无线瓷砖(
标题:“管理员”,
字幕:
“完全访问管理故事。”,
selectedItem:AccessRole.Admin,
),
定制无线瓷砖(
标题:“经理”,
字幕:
“有限的编辑权限”,
选择EdItem:AccessRole.Manager,
),
定制无线瓷砖(
标题:“仅限查看”,
字幕:
'可以查看但不能编辑',
选择EdItem:AccessRole.ViewOnly,
),
定制无线瓷砖(
标题:“禁止访问”,
选择EdItem:AccessRole.NoAccess,
),
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
钥匙:_scaffoldKey,
appBar:HwAppBar(
标题:“设置访问级别”,
内隐式:错误,
行动:[
图标按钮(
图标:SvgPicture.asset(
HwSvgs.closeIcon,