Как установить цвет индикатора для более чем одной вкладки одновременно в представлении flutter панели вкладок?

#flutter #tabs #flutter-layout

#flutter #вкладки #flutter-макет

Вопрос:

У меня есть вид панели вкладок с 3 вкладками, Email, Profile, Complete . Теперь в Email таком виде есть кнопка:

1. Вкладка электронной почты

                     widget.theTabController.animateTo(
                      (widget.theTabController.index   1),
                    );
 

При нажатии на эту кнопку вкладка меняется, а цвет индикатора меняется.
Но есть ли какой-нибудь способ сохранить цвет индикатора Email tab таким же, как у Profile tab подобных:

введите описание изображения здесь

Ниже приведен код моего представления панели вкладок.

Вид панели вкладок

 class SignupEmail extends StatefulWidget {
  @override
  _SignupEmailState createState() => _SignupEmailState();
}

class _SignupEmailState extends State<SignupEmail>
    with SingleTickerProviderStateMixin {
  bool entryPermission = false;
  final List<Tab> myTabs = <Tab>[
    new Tab(text: 'EMAIL'),
    new Tab(text: 'PROFILE'),
    new Tab(text: 'COMPLETE'),
  ];
  TabController _tabController;
  void initState() {
    super.initState();
    _tabController = new TabController(vsync: this, length: myTabs.length);
    _tabController.addListener(() {
      print("Selected Index: "   _tabController.index.toString());
    });
  }

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

  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        backgroundColor: Colors.white,
        body: SingleChildScrollView(
          child: Padding(
            padding:
                const EdgeInsets.only(left: 16, right: 16, top: 50, bottom: 0),
            child: Container(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  MainTitle(),
                  Container(
                    child: DefaultTabController(
                        length: myTabs.length,
                        child: Column(
                          children: [
                            Container(
                              // height: 50,
                              width: double.infinity,
                              child: IgnorePointer(
                                child: TabBar(
                                  controller: _tabController,
                                  unselectedLabelColor:
                                      Color.fromRGBO(0, 0, 0, 0.87),
                                  labelColor: Color(0xff9E9E9E),
                                  indicatorColor: Color.fromRGBO(98, 0, 238, 1),
                                  tabs: myTabs,
                                ),
                              ),
                            ),
                            SizedBox(
                              height: 28,
                            ),
                            Container(
                              width: double.infinity,
                              height: 500,
                              child: TabBarView(
                                  // physics: NeverScrollableScrollPhysics(),
                                  controller: _tabController,
                                  children: [
                                    EmailTab(
                                      theTabController: _tabController,
                                    ),
                                    ProfileTab(
                                      theTabController: _tabController,
                                    ),
                                    CompleteEmail()
                                  ]),
                            ),
                          ],
                        )),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

 

Ответ №1:

Я думаю, что единственный способ — создать навигацию по вкладкам самостоятельно. Недавно у меня была аналогичная проблема, когда я хотел, чтобы цвет вкладки соответствовал цвету экрана. Я просто создал стек с

                     Positioned(
                        left: safeAreaPos.dx,
                        width: safeAreaPos.dx   safeAreaSize.width,
                        bottom: 0,
                        child: Row(
                          children: [
                            for (var i = 0; i < 4; i  )
                              TabButton(i, context)
                          ],
 

и визуализируйте мою вкладку

   Widget TabButton(int tabIndex, BuildContext context) {
    final List<String> labels = ['A', 'B', 'C', 'D'];
    final List<double> labelSizes = [12, 16, 16, 12];
    return SizedBox(
      height: 50, width: safeAreaSize.width / 4,
      child:
        FlatButton(
          color: bgTabColors[tabIndex],
          padding: EdgeInsets.all(0),
          textColor: CupertinoColors.white,
          child: Text(labels[tabIndex], style: TextStyle(fontSize: labelSizes[tabIndex]),),
          onPressed: () =>
            BlocProvider.of<ProjectKanbanBloc>(context).add(ProjectKanbanTabRequested(tabIndex)),
        )
    );
  }
}