如何从多个屏幕访问控制器-Flutter

mkh04yzy  于 2023-11-21  发布在  Flutter
关注(0)|答案(2)|浏览(103)

假设我在statefullWidget中创建了一个ScrollController,如下所示:

late ScrollController controller;

  @override
  void initState() {
    super.initState();
    controller = ScrollController();
  }

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

字符串
在小部件内部使用这个控制器很容易。但是,如果我想从另一个屏幕访问该控制器,我必须将其作为参数传递,可能如下所示:

Navigator.pushNamed(context, '/another-screen', arguments: controller);


但是,如果屏幕是完全独立的呢?(我不能把它作为参数传递)我想用Provider来全局提供控制器。但是现在,我不能处理它。

nmpmafwu

nmpmafwu1#

考虑使用riverpod

首先创建一个状态通知程序提供程序,该提供程序将滚动控制器作为其状态
在这里,您可以放置与他相关的任何逻辑,并且可以通过重写State Notifier的dispose方法来处置他

class GlobalScrollController extends StateNotifier<ScrollController> {
      GlobalScrollController() : super(ScrollController());
 
      @override
      void dispose() {
        state.dispose();
        super.dispose();
      }
    }
    
    final globalScrollControllerProvider =
        StateNotifierProvider<GlobalScrollController, ScrollController>(
            (ref) => GlobalScrollController());

字符串

将提供程序连接到您要使用它的位置,如下所示

class Example extends ConsumerWidget {
      const Example({super.key});
    
      @override
      Widget build(BuildContext context, WidgetRef ref) {
        final scrollController = ref.watch(globalScrollControllerProvider);
    
        return Scaffold(
          body: ListView(
            controller: scrollController,
          ....
          ),
        );
      }
    }


你可以进一步优化它

w6mmgewl

w6mmgewl2#

尝试添加全局**late ScrollController控制器;然后初始化您可以在main.dartlate ScrollController控制器;**上声明的变量

相关问题