aagarwal1012 / aagarwal1012/Liquid-Pull-To-Refresh

child updates every time when clicking on the `LiquidPullToRefresh`

Đang mở
#78 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Dart
Star
1.3k
Fork
91
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

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.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
dart, flutter
Lĩnh vực
mobile
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
45/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.