dart 错误[Get]检测到GetX使用不当,正在使用bottomNavigationBar

xmq68pz9  于 2022-12-15  发布在  其他
关注(0)|答案(6)|浏览(255)

我试图实现一个bottomNavigationBar,但是我无法完成它,我正在使用Get来处理应用程序的路径和状态。
我是flutter的新手,但是阅读文档时我仍然不理解
这是主窗口小部件。

Widget build(BuildContext context) {
return SafeArea(
  child: Scaffold(
      appBar: AppBar(
        backgroundColor: AppColors.black,
        title: Center(
          child: CommonAssetImage(
            asset: 'logo.png',
            color: AppColors.white,
            height: 30,
          ),
        ),
      ),
      body: BodyTabsScreen(),
      bottomNavigationBar: HomeScreenBottomNavigatorBar()),
);

}
然后,我有一个小部件可以调用其他小部件。
x一个一个一个一个x一个一个二个x

c7rzv4ha

c7rzv4ha1#

当你使用ObxGetx小部件而没有插入一个可观察的变量时,Getx总是会抛出这个错误。所以如果你不想基于一个扩展GetxController的类中的变量的更新值来重建一个小部件,那么就不要使用Getx小部件。
如果您只是尝试使用Getx进行路由,那么请确保将MaterialApp更改为GetMaterialApp并定义路由,如下所示。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      home: Page1(),
      getPages: [
       GetPage(name: Page1.id, page: () =>  Page1()), // add: static const id = 'your_page_name'; on each page to avoid using raw strings for routing
       GetPage(name: Page2.id, page: () =>  Page2()),
      ],
    );
  }
}

然后在底部导航栏的onTap中使用
Get.to(Page2());

pw136qt2

pw136qt22#

只需删除包含Row小部件的Obx小部件,如下所示:

class HomeScreenBottomNavigatorBar extends StatelessWidget {
  const HomeScreenBottomNavigatorBar({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Material(
      elevation: 10,
      color: AppColors.white,
      child: Container(
        height: 60,
        padding: const EdgeInsets.symmetric(horizontal: 27),
        color: AppColors.white,
        child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              TabsScreenBottomNavigationTab(
                  isActive: true,
                  label: 'Buy',
                  icon: Icons.home,
                  onTap: () {}),
              TabsScreenBottomNavigationTab(
                  label: 'My account',
                  // icon: IkramIcons.user,
                  // iconSize: 20,
                  icon: (Icons.home),
                  onTap: () {}),
            ],
          );
      ),
    );

  }
}

为什么?因为你没有在你的小部件树中使用任何可观察的(obs/Rx)变量,当值改变时,它会触发重建。所以GetX抱怨是有原因的。

zi8p0yeb

zi8p0yeb3#

控制器应在Obx内部,否则其显示此错误。

LeaderBoardController controller = Get.put(getIt<LeaderBoardController>());
    
    
     Obx(()=>controller.leadBoardModel != null
              ? Column(
            children: [
              Container(
                height: 180,
                child: Row(
                    mainAxisAlignment: MainAxisAlignment.start,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      LeadBoardImage(type: LEADTYPE.NORMAL),
                      LeadBoardImage(type: LEADTYPE.CROWN),
                      LeadBoardImage(type: LEADTYPE.NORMAL)
                    ]),
              ),
              Expanded(
                flex: 4,
                child: ListView(
                  padding: EdgeInsets.symmetric(horizontal: 10.w),
                  children: [
                    for (int i = 4; i < controller.leadBoardModel!.data.result.length; i++)
                      LeaderBoardListItem(result:controller.leadBoardModel!.data.result[i])
                  ],
                ),
              )
            ],
          )
              : LoadingContainer()),
e1xvtsh3

e1xvtsh34#

请注意,有两个必需方面:1)从GetXController扩展,2)从控制器返回值的字段/方法必须从Rx类型计算。在我的例子中,我为测试创建了GetXController的子类,返回值是硬编码的(不基于Rx值),并发生了ObX错误。

bvhaajcl

bvhaajcl5#

对于当前方案**You dont need to use getx for this page(其实现不正确),请删除OBX()**,错误将消失。

class HomeScreenBottomNavigatorBar extends StatelessWidget {
  const HomeScreenBottomNavigatorBar({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Material(
      elevation: 10,
      color: AppColors.white,
      child: Container(
        height: 60,
        padding: const EdgeInsets.symmetric(horizontal: 27),
        color: AppColors.white,
        child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              TabsScreenBottomNavigationTab(
                  isActive: true,
                  label: 'Buy',
                  icon: Icons.home,
                  onTap: () {}),
              TabsScreenBottomNavigationTab(
                  label: 'My account',
                  // icon: IkramIcons.user,
                  // iconSize: 20,
                  icon: (Icons.home),
                  onTap: () {}),
            ],
          );
        }),
      ),
    

  
}
plupiseo

plupiseo6#

当你没有在你的小部件中使用你的控制器值时就会发生这种情况。这就是为什么它会出错,因为使用Obx或Getx()小部件没有意义

MainController controller = Get.find();
return Obx(
    ()
        {
          return Column(
            children: [
              Text("My pretty text")
            ],
          );
        }
);

解决方案:

MainController controller = Get.find();
Obx(
    ()
        {
          return Column(
            children: [
              Text(controller.text)
            ],
          );
        }
);

相关问题