Flutter 颤振|在导航器堆栈中的所有屏幕上从最顶部屏幕更新复选框

Flutter 颤振|在导航器堆栈中的所有屏幕上从最顶部屏幕更新复选框,flutter,flutter-bloc,Flutter,Flutter Bloc,嗨,在我的颤振应用程序中,我必须在几个屏幕上添加复选框。 例如,如果我有6个屏幕,如Screen1、Screen2、Screen3、Screen4、Screen5和Screen6,我可以从Screen1导航到Screen2、Screen2导航到Screen3等等 我的屏幕堆栈示例 屏幕1->屏幕2->屏幕3->屏幕4->屏幕5->屏幕6 这里Screen1是我的根目录,Screen6是最上面的屏幕 如果我在屏幕1、屏幕2、屏幕4和屏幕6上有复选框 屏幕1(复选框)->屏幕2(复选框)->屏幕3-

嗨,在我的颤振应用程序中,我必须在几个屏幕上添加复选框。 例如,如果我有6个屏幕,如Screen1、Screen2、Screen3、Screen4、Screen5和Screen6,我可以从Screen1导航到Screen2、Screen2导航到Screen3等等

我的屏幕堆栈示例

屏幕1->屏幕2->屏幕3->屏幕4->屏幕5->屏幕6

这里Screen1是我的根目录,Screen6是最上面的屏幕

如果我在屏幕1、屏幕2、屏幕4和屏幕6上有复选框

屏幕1(复选框)->屏幕2(复选框)->屏幕3->屏幕4(复选框)->屏幕5->屏幕6(复选框)

现在的问题是,若我选中screen6的复选框,那个么所有其他屏幕上的复选框都必须被自动选中(选中)(不返回结果)

我使用的是颤振块软件包

请帮忙

已编辑


如果顶部屏幕(在navigator堆栈中)是Screen4或Screen2,则需要相同的操作。为此,您可以使用BLOC,这对初学者来说可能很困难,但另一个技巧是在单独的dart文件上创建另一个类。比如说

show the six checked box as Constants.box1 == "selected" ? Showcheckedbox() : showUncheckedBox()  

 // ? means if condition is true : means if condition is false

class Constants {
     string box1 ;
     string box2 ;
     string box3 ;
     string box4 ;
     string box5 ;

}

1. now, when you select the box1 as checked then there you can write it as Constants.box1= "selected";  

 2. and when you pop the screen there you can setState({}) on pop out the screen.

为此,您可以使用BLOC,这对初学者来说可能很困难,但另一个技巧是在单独的dart文件上创建另一个类。比如说

show the six checked box as Constants.box1 == "selected" ? Showcheckedbox() : showUncheckedBox()  

 // ? means if condition is true : means if condition is false

class Constants {
     string box1 ;
     string box2 ;
     string box3 ;
     string box4 ;
     string box5 ;

}

1. now, when you select the box1 as checked then there you can write it as Constants.box1= "selected";  

 2. and when you pop the screen there you can setState({}) on pop out the screen.

使用BLOC,您可以将复选框存储在某个状态中,并使用BLOC
events
触发对该状态的配置更改(选中/取消选中选项)

每次在BLOC中调用/添加事件时,都应该采用上一个状态,修改(选中/取消选中一个选项)并发出一个新状态。当发出一个新状态时,所有的
BlocBuilders
都会重新呈现,因此所有屏幕都是最新的(这就是flatter BLOC的实际工作方式)

现在最重要的想法是全局提供所创建的BLOC,或使相同的BLOC实例可用于所有屏幕(使用
BlocProvider.value
-还可以查看有关此主题的附加教程)。这样,每次使用
BlocBuilder
渲染复选框时,所有屏幕上都会出现相同的复选框/状态

我为您创建了一个完整的示例来说明上述所有内容。只需复制到main.dart并运行。花点时间阅读评论,如果有错误,请道歉(写下来花了一点时间)

import'包:bloc/bloc.dart';
进口“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
///
///我将复选框放在全局范围内,因为我不知道您如何访问
///但只要它们通过,你就可以随意放在任何你想放的地方
///加入欧盟。你甚至可以将它们添加到集团内部。
///
最终列表GCheckbox=[
选中(“复选框1”),
选中(“复选框2”),
选中(“复选框3”),
选中(“复选框4”),
选中(“复选框5”),
选中(“复选框6”),
选中(“复选框7”),
];
void main(){
runApp(CheckyApp());
}
///
///此小部件是应用程序的根。
///
类CheckyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
//为了演示起见,我将在全球范围内公开该集团
返回BlocProvider(
创建:(上下文)=>CheckyCubit(GCheckBox),
孩子:MaterialApp(
标题:“Checky应用程序”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
初始路由:“/screen_1”,
路线:{
“/screen_1”:(上下文)=>GenericScreen(1),
“/screen_2”:(上下文)=>GenericScreen(2),
“/screen_3”:(上下文)=>GenericScreen(3),
“/screen_4”:(上下文)=>GenericScreen(4),
“/screen_5”:(上下文)=>GenericScreen(5),
“/screen_6”:(上下文)=>SummaryScreen(),
},
));
}
}
///
///一个通用屏幕,用于演示可以在多个数据库之间访问数据
///屏风
///
类GenericScreen扩展了无状态小部件{
///
///这用于创建通用屏幕和导航按钮
///
最终int id;
const GenericScreen(this.id,{Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回堆栈(子级:[
脚手架(
appBar:appBar(
标题:文本(“Checky::Screen${this.id}”),
),
正文:BlocBuilder(
生成器:(上下文、状态){
返回ListView.builder(
itemCount:state.checkbox.length±0,
itemBuilder:(上下文,索引)=>
//基于BLOC中的状态数据呈现复选框。
//这里,为了举例,我只是模拟了复选框
手势检测器(
onTap:()=>
BlocProvider.of(上下文).toggle(索引),
子:容器(
填充:边缘设置。全部(10),
保证金:所有(5),
颜色:状态。复选框[索引]。已选中
?颜色.安培数
:颜色。白色,
子项:文本(state.checkbox[index].label),
),
),
);
},
),
),
//这对你来说并不重要
if(Navigator.of(context.canPop())
对齐(
对齐:对齐。左下角,
子:容器(
保证金:全部(20),
子:浮动操作按钮(
heroTag:“以前的_u$id”,
子:图标(图标。V形左),
onPressed:()=>Navigator.of(context.pop(),
),
),
),
如果(这个id)
Navigator.of(context.pushNamed(“/screen_${id+1}”),
),
),
),
]);
}
}
///
///最后一个屏幕,我们通过访问CheckyBloc来显示值。
///
类SummaryScreen扩展Stateles