xuelongqy / flutter_easy_refresh

A flutter widget that provides pull-down refresh and pull-up load.
https://xuelongqy.github.io/flutter_easy_refresh/
MIT License
3.89k stars 633 forks source link

refreshOnStart设置为true时首次加载只有动画onRefresh不回调 #789

Closed Misutesu closed 9 months ago

Misutesu commented 9 months ago

问题:

以下是我的测试代码

class MessagePage extends StatefulWidget {
  const MessagePage({super.key});

  @override
  State<MessagePage> createState() => _MessagePageState();
}

class _MessagePageState extends State<MessagePage> {
  late EasyRefreshController _refreshController;

  @override
  void initState() {
    super.initState();
    _refreshController = EasyRefreshController(
      controlFinishRefresh: true,
      controlFinishLoad: true,
    );
  }

  @override
  void dispose() {
    _refreshController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return EasyRefresh(
      controller: _refreshController,
      refreshOnStart: true,
      onRefresh: () async {
        //未执行
        print("on refresh");
        await Future.delayed(const Duration(seconds: 2));
        if (!mounted) {
          return;
        }
        _refreshController.finishRefresh();
        _refreshController.resetFooter();
      },
      child: ListView(children: const [
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
        Text("123"),
      ]),
    );
  }
}
xuelongqy commented 9 months ago

这个代码测试没有问题呢

Misutesu commented 9 months ago

这个代码测试没有问题呢

麻烦试试这个代码能不能复现呢?我这次是在本项目的example里运行的

我在onRefresh方法里加了一个Snackbar打印,这是运行的录屏

现在具体的现象是:

https://github.com/xuelongqy/flutter_easy_refresh/assets/20251580/814ca3e1-c39f-42bd-bfcb-0ee0b832caaa

import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';

main() {
  runApp(const TestPage());
}

class TestPage extends StatefulWidget {
  const TestPage({super.key});

  @override
  State<TestPage> createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  final _scaffoldKey = GlobalKey<ScaffoldState>();
  late EasyRefreshController _refreshController;

  @override
  void initState() {
    super.initState();
    _refreshController = EasyRefreshController(
      controlFinishRefresh: true,
      controlFinishLoad: true,
    );
  }

  @override
  void dispose() {
    _refreshController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        key: _scaffoldKey,
        body: EasyRefresh(
          controller: _refreshController,
          refreshOnStart: true,
          onRefresh: () async {
            print("on refresh");
            ScaffoldMessenger.of(_scaffoldKey.currentContext!)
                .showSnackBar(const SnackBar(content: Text("On Refresh")));
            await Future.delayed(const Duration(seconds: 2));
            if (!mounted) {
              return;
            }
            _refreshController.finishRefresh();
            _refreshController.resetFooter();
          },
          child: ListView(children: const [
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
            Text("123"),
          ]),
        ),
      ),
    );
  }
}
xuelongqy commented 9 months ago

我没用真机测。是不是只有启动App就刷新会出现这种情况?

Misutesu commented 9 months ago

不是的,用Navigator跳转到有问题的界面也会有这个问题,我用的是雷电模拟器测试的

Misutesu commented 9 months ago

刚才我测试了一下,只有雷电模拟器会有这个问题,AS的安卓模拟器和真机是正常的

雷电模拟器是Android9

没问题的真机是小米13Ultra Android14和AS自带的Android14模拟器

我明天再详细测试一下如果只在雷电模拟器上有问题的话那就不用管了

PlusWong commented 9 months ago

我这边也发现了这个问题,具体代码如下:


  Widget build(BuildContext context) {
    return Scaffold(
//设置这个appBar为null,即可复现该问题
      appBar: null,
      body: EasyRefresh(
        refreshOnStart: true,
        onRefresh: () async {
          debugPrint("on refresh");
          await Future.delayed(const Duration(seconds: 2));
        },
        onLoad: () async {
          debugPrint("on load");
          await Future.delayed(const Duration(seconds: 2));
        },
        child: CustomScrollView(
          slivers: [
            SliverList.builder(
                itemCount: 20,
                itemBuilder: (context, index) {
                  return Text("$index");
                })
          ],
        ),
      ),
    );
  }```
xuelongqy commented 9 months ago

我这边也发现了这个问题,具体代码如下:

  Widget build(BuildContext context) {
    return Scaffold(
//设置这个appBar为null,即可复现该问题
      appBar: null,
      body: EasyRefresh(
        refreshOnStart: true,
        onRefresh: () async {
          debugPrint("on refresh");
          await Future.delayed(const Duration(seconds: 2));
        },
        onLoad: () async {
          debugPrint("on load");
          await Future.delayed(const Duration(seconds: 2));
        },
        child: CustomScrollView(
          slivers: [
            SliverList.builder(
                itemCount: 20,
                itemBuilder: (context, index) {
                  return Text("$index");
                })
          ],
        ),
      ),
    );
  }```

真机吗?

PlusWong commented 9 months ago

我这边也发现了这个问题,具体代码如下:

  Widget build(BuildContext context) {
    return Scaffold(
//设置这个appBar为null,即可复现该问题
      appBar: null,
      body: EasyRefresh(
        refreshOnStart: true,
        onRefresh: () async {
          debugPrint("on refresh");
          await Future.delayed(const Duration(seconds: 2));
        },
        onLoad: () async {
          debugPrint("on load");
          await Future.delayed(const Duration(seconds: 2));
        },
        child: CustomScrollView(
          slivers: [
            SliverList.builder(
                itemCount: 20,
                itemBuilder: (context, index) {
                  return Text("$index");
                })
          ],
        ),
      ),
    );
  }```

真机吗?

是的,iPhone13、三星S22都会出现

saviourdog commented 9 months ago

3.3.2没问题,升级到最新版确实有这个问题

xuelongqy commented 9 months ago

可以试试github最新的代码是否修复。我没有复现设备,所以只是理论猜测

xuelongqy commented 9 months ago

3.3.4已尝试修复,如还有问题,请重新开启此issue