aagarwal1012 / aagarwal1012/Liquid-Pull-To-Refresh
child updates every time when clicking on the `LiquidPullToRefresh`
- 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
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