Flutter 颤振屏幕(列表)从另一个屏幕返回后正在重新加载(详细信息)
我创建了一个带有列表的颤振应用程序。点击一个项目,我打开该项目的细节 问题是,每当我从详细信息屏幕返回时,列表屏幕都会重新加载。我不想每次都重新加载列表 我在这里使用了集团架构 下面是代码片段。请建议 多谢各位 MainFlutter 颤振屏幕(列表)从另一个屏幕返回后正在重新加载(详细信息),flutter,Flutter,我创建了一个带有列表的颤振应用程序。点击一个项目,我打开该项目的细节 问题是,每当我从详细信息屏幕返回时,列表屏幕都会重新加载。我不想每次都重新加载列表 我在这里使用了集团架构 下面是代码片段。请建议 多谢各位 Main void main() { final userRepository = UserRepository(); ApiClient apiClient = ApiClient(httpClient: http.Client()); runApp(BlocP
void main() {
final userRepository = UserRepository();
ApiClient apiClient = ApiClient(httpClient: http.Client());
runApp(BlocProvider<AuthenticationBloc>(
builder: (context) {
return AuthenticationBloc(
userRepository: userRepository, apiClient: apiClient)
..dispatch(AppStarted());
},
child: MyApp(userRepository: userRepository),
));
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
final UserRepository userRepository;
MyApp({Key key, @required this.userRepository}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: BlocBuilder<AuthenticationBloc, AuthenticationState>(
bloc: BlocProvider.of<AuthenticationBloc>(context),
builder: (context, state) {
if (state is AuthenticationUninitialized) {
return SplashPage();
}
if (state is AuthenticationAuthenticated) {
return HomePage(userRepository: userRepository);
}
if (state is AuthenticationUnauthenticated) {
return LoginPage(userRepository: userRepository);
}
if (state is AuthenticationLoading) {
return LoadingIndicator();
}
return null;
},
),
);
}
}
class HomePage extends StatelessWidget {
UserRepository userRepository;
HomePage({@required this.userRepository}) : super();
@override
Widget build(BuildContext context) {
ApiClient apiClient = ApiClient(httpClient: http.Client());
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
drawer: AppDrawer(userRepository),
body: BlocProvider(
builder: (context) {
return HomeBloc(apiClient);
},
child: _HomeContent(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
backgroundColor: Colors.amberAccent,
),
);
}
}
class _HomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final HomeBloc homeBloc = BlocProvider.of<HomeBloc>(context);
homeBloc.dispatch(FetchMovieList());
return BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
if (state is MovieListLoading) {
return Center(
child: CircularProgressIndicator(),
);
}
if (state is MovieListLoaded) {
List<Movie> topRatedMovies = state.movieList;
return new ListView.builder(
itemBuilder: (BuildContext context, int index) {
return new ListTile(
title: Card(
child: Row(
children: <Widget>[
Image.network(ApiClient.IMAGE_BASE_URL +
topRatedMovies[index].poster_path),
Column(
children: <Widget>[
Text(topRatedMovies[index].title),
],
)
],
),
),
onTap: () {
_onListItemTapped(topRatedMovies[index].id, context);
},
);
},
itemCount: topRatedMovies.length,
);
}
if (state is MovieListError) {
return Center(
child: Text('Error in calling API'),
);
}
return Center(child: Text('Employee data not found'));
},
);
}
void _onListItemTapped(int movieId, BuildContext context) {
Navigator.push(context,
MaterialPageRoute(
builder: (context) => MovieDetailPage(
movieId: movieId,
)));
}
}
void main(){
final userRepository=userRepository();
ApiClient-ApiClient=ApiClient(httpClient:http.Client());
runApp(BlocProvider(
生成器:(上下文){
返回AuthenticationBloc(
userRepository:userRepository,apiClient:apiClient)
…调度(AppStarted());
},
子项:MyApp(userRepository:userRepository),
));
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
最终用户存储库用户存储库;
MyApp({Key Key,@required this.userRepository}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:BlocBuilder(
bloc:BlocProvider.of(上下文),
生成器:(上下文、状态){
如果(状态为AuthenticationUninitialized){
返回第页();
}
如果(状态为AuthenticationAuthenticated){
返回主页(userRepository:userRepository);
}
如果(状态为AuthenticationUnauthenticated){
返回登录页面(userRepository:userRepository);
}
如果(状态为AuthenticationLoading){
返回LoadingIndicator();
}
返回null;
},
),
);
}
}
列表屏幕
void main() {
final userRepository = UserRepository();
ApiClient apiClient = ApiClient(httpClient: http.Client());
runApp(BlocProvider<AuthenticationBloc>(
builder: (context) {
return AuthenticationBloc(
userRepository: userRepository, apiClient: apiClient)
..dispatch(AppStarted());
},
child: MyApp(userRepository: userRepository),
));
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
final UserRepository userRepository;
MyApp({Key key, @required this.userRepository}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: BlocBuilder<AuthenticationBloc, AuthenticationState>(
bloc: BlocProvider.of<AuthenticationBloc>(context),
builder: (context, state) {
if (state is AuthenticationUninitialized) {
return SplashPage();
}
if (state is AuthenticationAuthenticated) {
return HomePage(userRepository: userRepository);
}
if (state is AuthenticationUnauthenticated) {
return LoginPage(userRepository: userRepository);
}
if (state is AuthenticationLoading) {
return LoadingIndicator();
}
return null;
},
),
);
}
}
class HomePage extends StatelessWidget {
UserRepository userRepository;
HomePage({@required this.userRepository}) : super();
@override
Widget build(BuildContext context) {
ApiClient apiClient = ApiClient(httpClient: http.Client());
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
drawer: AppDrawer(userRepository),
body: BlocProvider(
builder: (context) {
return HomeBloc(apiClient);
},
child: _HomeContent(),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
backgroundColor: Colors.amberAccent,
),
);
}
}
class _HomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final HomeBloc homeBloc = BlocProvider.of<HomeBloc>(context);
homeBloc.dispatch(FetchMovieList());
return BlocBuilder<HomeBloc, HomeState>(
builder: (context, state) {
if (state is MovieListLoading) {
return Center(
child: CircularProgressIndicator(),
);
}
if (state is MovieListLoaded) {
List<Movie> topRatedMovies = state.movieList;
return new ListView.builder(
itemBuilder: (BuildContext context, int index) {
return new ListTile(
title: Card(
child: Row(
children: <Widget>[
Image.network(ApiClient.IMAGE_BASE_URL +
topRatedMovies[index].poster_path),
Column(
children: <Widget>[
Text(topRatedMovies[index].title),
],
)
],
),
),
onTap: () {
_onListItemTapped(topRatedMovies[index].id, context);
},
);
},
itemCount: topRatedMovies.length,
);
}
if (state is MovieListError) {
return Center(
child: Text('Error in calling API'),
);
}
return Center(child: Text('Employee data not found'));
},
);
}
void _onListItemTapped(int movieId, BuildContext context) {
Navigator.push(context,
MaterialPageRoute(
builder: (context) => MovieDetailPage(
movieId: movieId,
)));
}
}
类主页扩展了无状态小部件{
用户存储库用户存储库;
主页({@required this.userRepository}):super();
@凌驾
小部件构建(构建上下文){
ApiClient-ApiClient=ApiClient(httpClient:http.Client());
返回脚手架(
appBar:appBar(
标题:文本(“主页”),
),
抽屉:AppDrawer(用户存储库),
正文:BlocProvider(
生成器:(上下文){
返回HomeBloc(apiClient);
},
子项:_HomeContent(),
),
浮动操作按钮:浮动操作按钮(
按下:(){},
子:图标(Icons.add),
背景颜色:Colors.amberAccent,
),
);
}
}
类\u HomeContent扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
最终HomeBloc HomeBloc=BlocProvider.of(上下文);
homeBloc.dispatch(FetchMovieList());
返回BlocBuilder(
生成器:(上下文、状态){
如果(状态为MovieListLoading){
返回中心(
子对象:CircularProgressIndicator(),
);
}
如果(状态为MovieListLoaded){
List topRatedMovies=state.movieList;
返回新的ListView.builder(
itemBuilder:(构建上下文,int索引){
返回新的ListTile(
标题:卡片(
孩子:排(
儿童:[
Image.network(ApiClient.Image\u BASE\u URL+
topRatedMovies[索引]。海报路径),
纵队(
儿童:[
文本(topRatedMovies[索引].标题),
],
)
],
),
),
onTap:(){
_onListItemTapped(topRatedMovies[index].id,context);
},
);
},
itemCount:topRatedMovies.length,
);
}
如果(状态为MovieListError){
返回中心(
child:Text('调用API时出错'),
);
}
返回中心(子项:文本(“未找到员工数据”);
},
);
}
void _onListItemTapped(int movieId,BuildContext){
Navigator.push(上下文,
材料路线(
生成器:(上下文)=>MovieDetailPage(
电影ID:movieId,
)));
}
}
在任何时候,您的生成方法都需要为多个生成调用做好准备。若生成调用导致了问题,那个么可能是出了问题。最好在构建方法之外获取数据,以防止不必要的API调用
例如,您可以创建一个有状态小部件,并在initState方法中获取数据。然后,调用build方法来准备带有数据的UI。您可以使用Future Builder在获取数据时显示进度和更新UI
例如:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
Future _future;
Future getData() async {
// Fetch data
}
@override
void initState() {
super.initState();
_future = getData();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _future,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
case ConnectionState.waiting:
return Center(child: CircularProgressIndicator());
default:
if (snapshot.data.hasErrors) {
return Text('Error: ${snapshot.data.errors}');
} else {
// Data is fetched, build UI
return ListTile();
}
}
});
}
}
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
未来,未来;;
Future getData()异步{
//获取数据
}
@凌驾
void initState(){
super.initState();
_future=getData();
}
@凌驾
小部件构建(构建上下文){
回归未来建设者(
未来:未来,
生成器:(上下文,快照){
交换机(快照.连接状态){
案例连接状态。无:
案例连接状态。正在等待:
返回中心(子项:CircularProgressIndicator());
违约:
if(snapshot.data.hasErrors){
返回文本('Error:${snapshot.data.errors}');
}否则{
//获取数据,构建用户界面
返回ListTile();
}
}
});
}
}
“我不想每次都重新加载列表。”
-事情就是这样运作的:build()
方法总是被调用的,你无法避免哦,好的。我在想我们可以像本地安卓一样控制它。谢谢回复@pskink