aagarwal1012 / aagarwal1012/Liquid-Pull-To-Refresh
child updates every time when clicking on the `LiquidPullToRefresh`
- Langage dominant
- Dart
- Étoiles
- 1.3k
- Forks
- 91
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
**Describe the bug**
the `LiquidPullToRefresh` is supposed to update only when the user `Pull` not when the user clicks, this causes performance issues
**To Reproduce**
here's the code I use for `home_page.dart`
```dart
class _AccountsPageState extends State {
final Sql db = Sql();
late Future> _futuredAccounts;
final FocusNode _searchBarFocus = FocusNode();
final TextEditingController _searchController = TextEditingController();
@override
void initState() {
super.initState();
_futuredAccounts = getData();
_searchController.addListener(() => setState(() {}));
}
Future> getData() async {
AccountsState accountsState = Provider.of(context, listen: false);
accountsState.accounts.clear();
Provider.of(context, listen: false).currentAccountID = null;
List> accountsFound = await db.getAccount('SELECT * FROM "accounts"');
if (mounted) {
accountsState
..addManyAccount(accountsFound.map((account) => Account.fromObject(account)).toList())
..accountsState.filterdAccounts = accountsState.accounts;
}
return accountsState.filterdAccounts;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: LiquidPullToRefresh(
height: 160,
springAnimationDurationInMilliseconds: 700,
color: Theme.of(context).brightness == Brightness.dark
? const Color.fromARGB(255, 62, 66, 64)
: Theme.of(context).colorScheme.primary,
backgroundColor: Colors.white,
onRefresh: getData,
child: Column(
children: [
CustomAppbar(
child: Column(
children: [
const SizedBox(
height: 35,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const SizedBox(
width: 40,
),
Text(
"appbar_title".tr(),
style: const TextStyle(
fontSize: 25,
fontWeight: FontWeight.bold,
color: Colors.white),
),
IconButton(
onPressed: () => Navigator.of(context).push(
CupertinoPageRoute(
builder: (context) => SettingsPage())),
icon: const Icon(
Icons.settings_outlined,
color: Colors.white,
)),
],
),
const SizedBox(height: 5),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Selector(
selector: (context, state) => state.searchBy,
builder: (context, searchBy, child) => SearchBar(
controller: _searchController,
focusNode: _searchBarFocus,
leading: const Icon(Icons.search),
trailing: _searchController.text.isEmpty
? null
: [
IconButton(
onPressed: () {
_searchController.clear();
_searchBarFocus.previousFocus();
AccountsState accountsState =
Provider.of(context,
listen: false);
accountsState.filterdAccounts =
accountsState.accounts;
},
icon: const Icon(Icons.close_rounded))
],
hintText: "search".tr(),
onChanged: (value) => _setAccounts(value, searchBy),
onTapOutside: (event) =>
_searchBarFocus.previousFocus(),
),
),
)
],
),
),
Selector(
selector: (context, state) => state.doRefresh,
builder: (context, shouldRefresh, child) {
if (shouldRefresh) {
_futuredAccounts = getData();
Provider.of(context, listen: false)
.doRefresh = false;
}
return FutureBuilder(
future: _futuredAccounts,
builder: (context, snapshot) {
print("future changed");
if (snapshot.connectionState ==
ConnectionState.waiting) {
return Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("loading".tr()),
const SizedBox(width: 20),
const CircularProgressIndicator(),
],
)),
],
),
);
} else if (snapshot.hasError) {
return Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: Text(
"${"error".tr()} ${snapshot.error}")),
],
),
);
} else if (snapshot.data!.isEmpty) {
return Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(child: Text("when_no_accounts".tr())),
],
),
);
} else {
print("has data");
return Selector>(
selector: (context, state) => state.filterdAccounts,
builder: (context, accounts, child) {
print("changed");
return Expanded(
child: ListView.builder(
itemCount: accounts.length,
itemBuilder: (context, index) => Selector(
selector: (context, state) => state.isDetailsHidden,
builder: (context, isDetailsHidden, child) => AccountCard(
accountSecurityEnabled: isDetailsHidden,
account: accounts[index]
)
)
),
);
});
}
});
}),
],
),
),
);
}
}
```
**Expected behavior**
like I said, `onPull`, it refreshes the child, also when click it refreshes again
**Flutter:**
- 3.27.4
- channel stable
**Dart:**
- 3.6.2
**Additional context**
can anyone please let me know if there's a solution for this
and thanks for your efforts.
Guide de contribution
Ouvrir le guide de contribution
Piste de recherche
The issue is in home_page.dart where LiquidPullToRefresh triggers getData on click. Examine the LiquidPullToRefresh widget's source in the repository to understand its onRefresh callback behavior. Check if there's a property to disable click-triggered refresh or if the widget's internal logic needs adjustment. Verify by running the provided code and observing the print statements to see when future changes.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- dart, flutter
- Domaine
- mobile
- Type d'issue
- Bug
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 45/100