flutter 项目 ScrollController attached to multiple scroll views,Failed assertion: line 109 pos 12 报错处理

flutter 项目 ScrollController attached to multiple scroll views,Failed assertion: line 109 pos 12 报错处理,第1张

一、说明

最近在写flutter项目的时候,遇到报错 :

The following assertion was thrown while handling a gesture:
ScrollController attached to multiple scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 109 pos 12: '_positions.length == 1'

出现报错的原因:
1.项目添加的Drawer功能,需要通过 Drawer 的菜单项 导航到不同的页面。
2.在主页添加了 BottomNavigationBar ,通过pagecontroller 导航到不同的页面。
3.项目通过Getx 做路由和状态管理。

问题出现说明:通过 Drawer 导航到设置或者其他页面,然后又通过 Drawer 重新导航到 主页,点击 BottomNavigationBar 的item项 就会出现
Failed assertion: line 109 pos 12: '_positions.length == 1’
的报错提示。

二、解决方式: Drawer 导航 使用 Get.offAndToNamed(‘12313’); 方式跳转。每次 跳转到 主页时需要重新初始化 pageController ,通过GetView 的build 方法,每次在重新绘制 主页界面时,重新初始化controller 。

具体 *** 作:
Drawer 导航部分代码:

class AppRouteProvide {
  Future onRouteTo(String routeName) {
    switch (routeName) {
      case Routes.Auth:
        Get.toNamed(Routes.Auth);
        break;
      case Routes.Home:
        Get.offAndToNamed(Routes.Home);
        break;
      case Routes.Help:
        Get.offAndToNamed(Routes.Help);
        break;
      case Routes.Splash:
        Get.toNamed(Routes.Splash);
        break;
      case Routes.Connect:
        Get.offAndToNamed(Routes.Connect);
        break;
      case Routes.Setting:
        Get.offAndToNamed(Routes.Setting);
        break;
    }
    return Future.value();
  }
}

主页view部分代码:

class HomeScreen extends GetView<HomeController> {
  @override
  Widget build(BuildContext context) {
    // print('HomeScreen build');
    if (controller.pageController.hasClients) {
      controller.onClose();
      controller.onInit();
    }
    return AppbarWidgetScreen(
      body: _buildBody(context),
      bottomBar: _buildBottomNavigationBar(context),
    );
  }

主页 controller 部分代码


class HomeController extends GetxController {
  final ApiRepository apiRepository;
  RxInt selectedIndex = 0.obs;

  late PageController pageController;
  RxList<Widget> widgetPage = <Widget>[
    HomeMainScreen(),
    HomeBuyScreen(),
    HomeCertScreen(),
    HomeSellScreen(),
    HomeMineScreen(),
  ].obs;

  HomeController({required this.apiRepository});

  @override
  void onReady() {
    super.onReady();
  }

  @override
  void onInit() {
    print('HomeController onInit()');
    pageController = PageController(
      initialPage: selectedIndex.value,
      keepPage: true,
    );
    super.onInit();
  }

  @override
  void onClose() {
    super.onClose();
  }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/993321.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存