aagarwal1012 / aagarwal1012/Liquid-Pull-To-Refresh

child updates every time when clicking on the `LiquidPullToRefresh`

オープン
#78 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Dart
スター
1.3k
フォーク
91
PR マージ指標
30日以内にマージされた PR はありません

説明

**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.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
dart, flutter
領域
mobile
issue の種類
バグ
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
45/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。