首先,这是固执己见的.
尽管您已经描述了很多,但要了解您的 case 以及您是如何(具体地)实现它的,还是有些棘手.但我会试着描述一下需要考虑的事情.
有几种方法可以处理这一问题.我会试着回答你们的问题.
- 始终拥有或仅拥有无状态的小部件和区块并没有什么错.
- 组合有状态窗口小部件和区块并没有什么错.
- 考虑具有阻止和例如更新该页面上的特定文本字段的定时器的页面的情况.为什么一个小部件要同时处理这两个问题?听起来页面可能是无状态的(使用块),其中包含文本字段,但该文本字段可以/应该是一个仅保存计时器的单独的StatefulWidget,或等效项.这意味着有时人们把很多责任放在一个巨大的小部件上,而实际上它应该被分成几个较小的小部件.
- 我不明白你为什么会面临这个错误,在一个有状态的小部件中同时拥有一个块和一个计时器是没有问题的,通过适当的处理和重置计时器来弹出和使用Back按钮.请参见下面的完整代码示例.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const FirstPage(),
);
}
}
class FirstPage extends StatelessWidget {
const FirstPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('First page'),
),
body: Center(
child: ElevatedButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => BlocProvider<FetcherCubit>(
create: (context) => FetcherCubit(),
child: const SecondPage(),
),
)),
child: const Text('Second page')),
),
);
}
}
class SecondPage extends StatefulWidget {
const SecondPage({super.key});
@override
State<SecondPage> createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
late final Timer myTimer;
int value = 0;
@override
void initState() {
super.initState();
myTimer = Timer.periodic(const Duration(seconds: 1), (timer) {
setState(() {
value++;
});
});
}
@override
void dispose() {
super.dispose();
myTimer.cancel();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Timer value: ${value.toString()}'),
ElevatedButton(
onPressed: () => context.read<FetcherCubit>().fetch(),
child: const Text('Fetch!'),
),
BlocBuilder<FetcherCubit, FetcherState>(
builder: (context, state) {
late final String text;
if (state is FetcherInitial) {
text = 'Initial';
} else if (state is FetcherLoading) {
text = 'Loading';
} else {
text = 'Completed';
}
return Text(text);
},
)
],
),
),
);
}
}
class FetcherCubit extends Cubit<FetcherState> {
FetcherCubit() : super(FetcherInitial());
Future<void> fetch() async {
emit(FetcherLoading());
await Future.delayed(const Duration(seconds: 3));
emit(FetcherCompleted());
}
}
@immutable
abstract class FetcherState {}
class FetcherInitial extends FetcherState {}
class FetcherLoading extends FetcherState {}
class FetcherCompleted extends FetcherState {}
如果你建造它,结果是: