flutter - 从一个选项卡更改为另一个选项卡时,所有选项卡都会不断重建

我遇到了这个问题,我在四个选项卡之间切换,每次单击其中一个时,CupertinoTabView 中的所有 4 个小部件都会重建。

我尝试将三元组更改为开关,但结果是一样的。 还尝试在所有 4 个页面上使用 automatickeepaliveclientmixin(使用 super on build 方法和 wantKeepAlive getter),但没有用。

这部分的代码如下:


class _MainTabsState extends State<MainTabs> {

  _buildCartButton(index) {
    // Some code I do here
  }

  int index = 0;

  @override
  Widget build(BuildContext context) {
    return CupertinoTabScaffold(
      tabBar: CupertinoTabBar(
        items: [
          BottomNavigationBarItem(
            title: Text(I18n.of(context).home, style: TextStyle(fontSize: 12.0)),
            icon: Icon(Icons.home),
          ),
          BottomNavigationBarItem(
            title: Text(I18n.of(context).search, style: TextStyle(fontSize: 12.0)),
            icon: Icon(Icons.search),
          ),
          _buildCartButton(index),
          BottomNavigationBarItem(
            title: Text(I18n.of(context).user, style: TextStyle(fontSize: 12.0)),
            icon: Icon(Icons.person),
          ),
        ],
        activeColor: Colors.orange,
        currentIndex: index,
        onTap: (ind) {
          setState(() {
            index = ind;
          });
        },
      ),
      tabBuilder: (context, i) {
        return CupertinoTabView(builder: (context) {
          return (i == 0)
              ? HomePage()
              : (i == 1) ? SearchPage() : (i == 2) ? CartPage() : UserPage();
        });
      },
    );
  }
}

我只是在每个页面的构建方法的开头打印一些东西,每次更改标签时我都会看到 4 个打印。

此外,我正在使用 Cupertino,因为我需要在页面中保持底部栏的持久性(例如,我在主页上使用一个导航器,它指向另一个屏幕,我需要在那里显示底部栏)。

编辑:这是其中一个页面的代码。我在每一页上打印,每次单击其中一个选项卡时,我都会在终端上看到打印。

class HomePage extends StatefulWidget {
  HomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin {
  _changeLanguage(CartModel model) {
    if (I18n.of(context).toString() == 'Instance of \'_I18n_en_US\'') {
      I18n.onLocaleChanged(Locale('pt', 'BR'));
      model.changeCurrency('BRL');
    }
    if (I18n.of(context).toString() == 'Instance of \'_I18n_pt_BR\'') {
      I18n.onLocaleChanged(Locale('en', 'US'));
      model.changeCurrency('USD');
    }
  }

  @override
  bool get wantKeepAlive => true;


  @override
  Widget build(BuildContext context) {
    super.build(context);

    print('hi home');
    return Scaffold(
    ...

最佳答案

我遇到了类似的问题。当我通过给页面一个列表来组织要在 CupertinoTabView 中显示的页面时,这个问题就解决了。

    class _MainTabsState extends State<MainTabs> {

    _buildCartButton(index) {
    // Some code I do here
    }

    int index = 0;
 
    final List<Widget> _pages = [
    HomePage(),
    SearchPage(),
    CartPage(),
    UserPage()];

    @override
    Widget build(BuildContext context) {
    return CupertinoTabScaffold(
      tabBar: CupertinoTabBar(
        items: [
          BottomNavigationBarItem(
            title: Text(I18n.of(context).home, style: TextStyle(fontSize: 12.0)),
            icon: Icon(Icons.home),
          ),
          BottomNavigationBarItem(
            title: Text(I18n.of(context).search, style: TextStyle(fontSize: 12.0)),
            icon: Icon(Icons.search),
          ),
          _buildCartButton(index),
          BottomNavigationBarItem(
            title: Text(I18n.of(context).user, style: TextStyle(fontSize: 12.0)),
            icon: Icon(Icons.person),
          ),
        ],
        activeColor: Colors.orange,
        currentIndex: index,
        onTap: (ind) {
          setState(() {
            index = ind;
          });
        },
      ),
      tabBuilder: (context, i) {
        return CupertinoTabView(builder: (context) {
          return _pages[i];
        });
      },
    );
  }
}

https://stackoverflow.com/questions/60219147/

相关文章:

xaml - 如何在使用 xamarin shell 时更改状态栏颜色

google-cloud-functions - ingressSettings = ALLOW_I

swift - PHPhotoLibrary 出错,无法保存视频

javascript - 雅格斯 : access processed argv in fail f

amazon-web-services - AWS Lambda 不等待代码上传到 Terrafor

c# - Blazor 在 X 量空闲时间后做某事

r - 无法在 R Studio 中安装包

node.js - Lambda 失败并显示 "Cannot find module..."

sql-server - SSIS:发生 OLE DB 错误。错误代码 0x80004005,对方过

graphql - Apollo Graphql : Rename schema for backw