如何为底部导航条的材质按钮设置onPressed时的状态。

问题描述 投票:1回答:1

我现在需要 setState 对于 MaterialButton 对于 bottomNavigationBar 改变屏幕上的一个小部件......。

所以问题就出在下面的部分。

MaterialButton(
  padding: EdgeInsets.all(0),
  minWidth: 155,
  onPressed: () {
    setState(() {
      currentScreen =
          HomeGrid(); // if user taps on this dashboard tab will be active
      currentTab = 0;
    });
  },
  child: Column(
    mainAxisAlignment: MainAxisAlignment.center,
    children: <Widget>[
      Icon(
        Icons.home,
        color: currentTab == 0
            ? Colors.blue
            : Colors.grey,
      ),
      Text(
        'Home',
        style: TextStyle(
          color: currentTab == 0
              ? Colors.blue
              : Colors.grey,
        ),
      ),
    ],
  ),
),

这是完整的代码

import 'package:flutter/rendering.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../providers/properties.dart';
import '../providers/cities.dart';
import '../widgets/home_grid.dart';
import '../widgets/properties_grid.dart';
import '../app_theme.dart';

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key key}) : super(key: key);

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

class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
  int currentTab = 0;
  ScrollController _scrollController = ScrollController();
  bool _showBottomBar = true;

  final List<Widget> screens = [
    HomeGrid(),
    PropertiesGrid(),
  ]; 

  Widget currentScreen = HomeGrid();

  int _selectedPageIndex = 0;

  _scrollListener() {
    if (_scrollController.position.userScrollDirection ==
        ScrollDirection.reverse) {
      setState(() {
        _showBottomBar = false;
      });
    } else if (_scrollController.position.userScrollDirection ==
        ScrollDirection.forward) {
      setState(() {
        _showBottomBar = true;
      });
    }
  }

  AnimationController animationController;
  bool multiple = true;

  @override
  void initState() {
    animationController = AnimationController(
        duration: const Duration(milliseconds: 2000), vsync: this);
    _scrollController.addListener(_scrollListener);
    super.initState();
  }

  void _selectPage(int index) {
    setState(() {
      _selectedPageIndex = index;
    });
  }

  Future<bool> getData() async {
    await Future<dynamic>.delayed(const Duration(milliseconds: 0));
    return true;
  }

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

  @override
  Widget build(BuildContext context) {
    // final properties = Provider.of<Properties>(context, listen: false);
    return DefaultTabController(
      length: 6, // Added
      initialIndex: 0,
      child: Scaffold(
        resizeToAvoidBottomPadding: false,
        extendBody: true,
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.add),
          onPressed: () {},
        ),
        floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
        bottomNavigationBar: AnimatedContainer(
          duration: Duration(milliseconds: 500),
          child: _showBottomBar
              ? BottomAppBar(
                  elevation: 0,
                  shape: CircularNotchedRectangle(),
                  notchMargin: 10,
                  child: Container(
                    height: 60,
                    child: Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: <Widget>[
                        Row(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            MaterialButton(
                              padding: EdgeInsets.all(0),
                              minWidth: 155,
                              onPressed: () {
                                setState(() {
                                  currentScreen =
                                      HomeGrid(); // if user taps on this dashboard tab will be active
                                  currentTab = 0;
                                });
                              },
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: <Widget>[
                                  Icon(
                                    Icons.home,
                                    color: currentTab == 0
                                        ? Colors.blue
                                        : Colors.grey,
                                  ),
                                  Text(
                                    'Home',
                                    style: TextStyle(
                                      color: currentTab == 0
                                          ? Colors.blue
                                          : Colors.grey,
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ],
                        ),

                        // Right Tab bar icons

                        Row(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            MaterialButton(
                              padding: EdgeInsets.all(0),
                              minWidth: 60,
                              onPressed: () {
                                setState(() {
                                  currentScreen =
                                      PropertiesGrid(); // if user taps on this dashboard tab will be active
                                  currentTab = 1;
                                });
                              },
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: <Widget>[
                                  Icon(
                                    Icons.view_list,
                                    color: currentTab == 1
                                        ? Colors.blue
                                        : Colors.grey,
                                  ),
                                  Text(
                                    'Property List',
                                    style: TextStyle(
                                      color: currentTab == 1
                                          ? Colors.blue
                                          : Colors.grey,
                                    ),
                                  ),
                                ],
                              ),
                            ),
                            MaterialButton(
                              padding: EdgeInsets.all(0),
                              minWidth: 77,
                              onPressed: () {
                                setState(() {
                                  // currentScreen =
                                  //     Settings(); // if user taps on this dashboard tab will be active
                                  currentTab = 2;
                                });
                              },
                              child: Column(
                                mainAxisAlignment: MainAxisAlignment.center,
                                children: <Widget>[
                                  Icon(
                                    Icons.location_searching,
                                    color: currentTab == 2
                                        ? Colors.blue
                                        : Colors.grey,
                                  ),
                                  Text(
                                    'Map',
                                    style: TextStyle(
                                      color: currentTab == 2
                                          ? Colors.blue
                                          : Colors.grey,
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ],
                        )
                      ],
                    ),
                  ),
                )
              : Container(
                  color: Colors.white,
                  width: MediaQuery.of(context).size.width,
                ),
        ),
        backgroundColor: AppTheme.white,
        body: Stack(
          children: <Widget>[
            FutureBuilder<bool>(
              future: getData(),
              builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
                if (!snapshot.hasData) {
                  return const SizedBox();
                } else {
                  return Padding(
                    padding: EdgeInsets.only(
                        top: MediaQuery.of(context).padding.top),
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        appBar(),
                        tabBar(),
                        Expanded(
                          child: FutureBuilder<bool>(
                            future: getData(),
                            builder: (BuildContext context,
                                AsyncSnapshot<bool> snapshot) {
                              if (!snapshot.hasData) {
                                return const SizedBox();
                              } else {
                                return MultiProvider(
                                  providers: [
                                    ChangeNotifierProvider(
                                        create: (context) => Properties()),
                                    ChangeNotifierProvider(
                                        create: (context) => Cities()),
                                  ],                                 child: HomeGrid(),
                                );
                              }
                            },
                          ),
                        ),
                      ],
                    ),
                  );
                }
              },
            ),
          ],
        ),
      ),
    );
  }

  Widget appBar() {
    return SizedBox(
      height: AppBar().preferredSize.height,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Padding(
            padding: const EdgeInsets.only(top: 8, left: 8),
            child: Container(
              width: AppBar().preferredSize.height - 8,
              height: AppBar().preferredSize.height - 8,
            ),
          ),
          Expanded(
            child: Center(
              child: Padding(
                padding: const EdgeInsets.only(top: 4),
                child:
                    Image.asset('assets/images/logo.png', fit: BoxFit.contain),
              ),
            ),
          ),
          Padding(
            padding: const EdgeInsets.only(top: 8, right: 8),
            child: Container(
              width: AppBar().preferredSize.height - 8,
              height: AppBar().preferredSize.height - 8,
              color: Colors.white,
              child: Material(
                color: Colors.transparent,
                child: InkWell(
                  borderRadius:
                      BorderRadius.circular(AppBar().preferredSize.height),
                  child: Icon(
                    Icons.location_on,
                    color: AppTheme.dark_grey,
                  ),
                  onTap: () {
                    setState(() {
                      multiple = !multiple;
                    });
                  },
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }

  Widget tabBar() {
    return SizedBox(
      height: AppBar().preferredSize.height,
      child: TabBar(
        isScrollable: true,
        unselectedLabelColor: Colors.green,
        labelColor: Colors.blue,
        indicatorColor: Colors.blue,
        labelStyle: TextStyle(fontSize: 15.0, fontStyle: FontStyle.italic),
        tabs: [
          Tab(
            child: Text('All'),
          ),
          Tab(
            child: Text('Office'),
          ),
          Tab(
            child: Text('Commercial'),
          ),
          Tab(
            child: Text('Land'),
          ),
          Tab(
            child: Text('House/Villa'),
          ),
          Tab(
            child: Text('Apartement'),
          ),
        ],
      ),
    );
  }
}

我需要在点击主页图标时设置默认的主页小部件的状态。HomeGrid,当点击 Properties List 只要设定好状态,并显示 Properties Grid

如果有任何需要的信息,请跟进下面的问题。

如何在BottomAppBar Icon项目上的onPressed时,替换一个小部件给孩子

我希望这将是足够清楚......

新增

我觉得下面的部分还缺了点东西,我现在需要为一个底层导航条的MaterialButton设置状态,以改变作为屏幕一部分的widget。

Expanded(
  child: FutureBuilder<bool>(
    future: getData(),
    builder: (BuildContext context,
        AsyncSnapshot<bool> snapshot) {
      if (!snapshot.hasData) {
        return const SizedBox();
      } else {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(
                create: (context) => Properties()),
            ChangeNotifierProvider(
                create: (context) => Cities()),
          ],
          // child: HomeGrid(_showOnlyFavorites),
          child: HomeGrid(),
        );
      }
    },
  ),
),
flutter dart
1个回答
1
投票

好吧,我解决了,所以相关的前面的代码是工作正常的问题在下面一行。

child: HomeGrid(),

改成这样

child: currentScreen,

我必须把子键作为 currentScreen 与此行有关。

Widget currentScreen = HomeGrid();

作为最后 Epanded 小部件为以下代码。

Expanded(
  child: FutureBuilder<bool>(
    future: getData(),
    builder: (BuildContext context,
        AsyncSnapshot<bool> snapshot) {
      if (!snapshot.hasData) {
        return const SizedBox();
      } else {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(
                create: (context) => Properties()),
            ChangeNotifierProvider(
                create: (context) => Cities()),
          ],
          // child: HomeGrid(_showOnlyFavorites),
          child: currentScreen,
        );
      }
    },
  ),
),
© www.soinside.com 2019 - 2024. All rights reserved.