Как я могу заставить функции нажатия работать в фоновом режиме, когда пользователь переключает экран
Когда пользователь нажимает кнопку подтверждения.
Когда пользователь нажимает кнопку «одобрить», в фоновом режиме происходит множество операций добавления и удаления. Если пользователь нажимает на bottomnavBar, чтобы изменить экран, фоновая обработка останавливается. Когда появляется экран загрузки
в пресс-коде:
Consumer<TimeSheets>(
builder: (ctx, timeSheetsData, _) =>
TextButton(
onPressed: () async {
// callApi1();
// readData();
//workingg
_isLoading = true;
widget.callback(_isLoading);
if (!mounted) return;
setState(() {});
await Provider.of<
pending_Sheets>(
context,
listen: false)
.add_pending_Sheets(
timeSheetsData.items);
await Provider.of<TimeSheets>(
context,
listen: false)
.deleteTimeSheet(
timeSheetsData.items);
_isLoading = false;
widget.callback(_isLoading);
if (!mounted) return;
setState(() {});
print(
'cac ${timeSheetsData.items}');
},
child: const Text(
'Send For Approval',
style: TextStyle(
color: kPrimaryColor),
)),
),
весь код виджета
class MyTimeSheets_page extends StatefulWidget {
const MyTimeSheets_page({Key? key, required this.callback}) : super(key: key);
final Function(bool) callback;
@override
State<MyTimeSheets_page> createState() => _MyTimeSheets_pageState();
}
class _MyTimeSheets_pageState extends State<MyTimeSheets_page> {
late DateTime fromDate;
late DateTime toDate;
// late Future<dynamic> userDataFuture;
var _isLoading = false;
// var _childLoading = false;
// var auth_provider;
@override
void initState() {
super.initState();
fromDate = DateTime.now();
toDate = DateTime.now().add(Duration(hours: 2));
print('after suppr');
}
var _isInit = true;
//var _isLoading = false;
@override
Future _refreshment(BuildContext context) async {
//${prefs.getString("uid")}
/* auth_provider =
await Provider.of<AuthenticationProvider>(context, listen: false); */
return Provider.of<TimeSheets>(context, listen: false)
.fetchAndSetTimeSheets(await customJugaar() ? true : false);
}
@override
Widget build(BuildContext context) {
print('rebuilding...');
return _isLoading
? Loading_Custom(
txtData: 'Sending For Approval ...',
)
: FutureBuilder(
future: _refreshment(context),
builder: (ctx, snapshot) => snapshot.connectionState ==
ConnectionState.waiting
? Loading_Custom(
txtData: '',
)
: RefreshIndicator(
color: kPrimaryColor,
onRefresh: () => _refreshment(context),
child: ListView(
physics: const AlwaysScrollableScrollPhysics(),
//NeverScrollableScrollPhysics(),
children: [
Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsets.fromLTRB(13, 3, 13, 0),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
Utils.toDate(fromDate),
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 15,
color: Colors.grey),
),
/* Text('1/7',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 15,
color: Colors.grey)) */
Align(
alignment: Alignment.topRight,
child: Consumer<TimeSheets>(
builder: (ctx, timeSheetsData, _) =>
TextButton(
onPressed: () async {
// callApi1();
// readData();
//workingg
_isLoading = true;
widget.callback(_isLoading);
if (!mounted) return;
setState(() {});
await Provider.of<
pending_Sheets>(
context,
listen: false)
.add_pending_Sheets(
timeSheetsData.items);
await Provider.of<TimeSheets>(
context,
listen: false)
.deleteTimeSheet(
timeSheetsData.items);
_isLoading = false;
widget.callback(_isLoading);
if (!mounted) return;
setState(() {});
print(
'cac ${timeSheetsData.items}');
},
child: const Text(
'Send For Approval',
style: TextStyle(
color: kPrimaryColor),
)),
),
),
],
),
),
TimeSheetList(),
Padding(
padding: const EdgeInsets.fromLTRB(13, 13, 13, 2),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
children: [
Text(
'Weekly ${Utils.toWeek(fromDate)} - ${Utils.toWeek1(fromDate.add(Duration(days: 7)))}',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 15,
color: Colors.grey),
),
],
),
),
Divider(
height: 20,
thickness: 2,
)
],
),
],
),
),
);
}
}
И возникает эта ошибка.
This error can occur when code calls setState() from a timer or an animation callback.
The preferred solution is to cancel the timer or stop listening to the animation in the dispose() callback.
Another solution is to check the "mounted" property of this object before calling setState() to ensure the object is still in the tree.
This error might indicate a memory leak if setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree.
**strong text** To avoid memory leaks, consider breaking the reference to this object during dispose().
Я хочу, чтобы пользователь мог менять экраны, но фоновая обработка никогда не должна останавливаться. Как я могу этого добиться?