【问题标题】:How to refresh the main page after opening a page from an android drawer menu with Flutter使用 Flutter 从 android 抽屉菜单打开页面后如何刷新主页
【发布时间】:2020-08-09 11:26:16
【问题描述】:

我有一个问题,我有一个主要活动,到目前为止我已经加载了几个小部件类。 现在我要做的是在关闭抽屉菜单中触发的页面后刷新主页。

如果按钮直接在主页上,它可以工作,但如果操作是从抽屉菜单触发的,则它不起作用。

屏幕示例或效果很好

选项 2 它应该看起来像这样。但是当我从抽屉菜单调用页面时它不起作用

参考链接: How to go back and refresh the previous page in Flutter? How to refresh a page after back button pressed

有没有人有想法。 以下是选项 1 与主页上的按钮一起使用的代码:

new RaisedButton(
          onPressed: ()=>
              Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new PageHomeContent()),)
                  .then((val)=>{getRefreshRequests()}),
          child: Text('Refresh', style: TextStyle(color: Colors.white), ), color: Colors.purple,
          elevation: 2.0,
        ),

重要的是要知道我在这里为抽屉菜单创建了一个类。它有点长,但我很重要

final Color primaryColor = Colors.white;
final Color activeColor = Colors.grey.shade800;
final Color dividerColor = Colors.grey.shade600;

class BuildDrawer extends StatefulWidget{
  @override
  _BuildDrawer createState() => _BuildDrawer();
}

class _BuildDrawer extends State<BuildDrawer> {
  //region [ ATTRIUTS ]
  final String image = 'https://avatars2.githubusercontent.com/u/3463865?s=460&u=c0fab43e4b105e9745dc3b5cf61e21e79c5406c2&v=4';

  List<dynamic> menuGroupList = [];
  Future<List<dynamic>> _futureMenuGroupList;
  bool _infiniteStop;

  //MenuItemGroupModel menuItemGroup = new MenuItemGroupModel();
  List<dynamic> menuItemList = [];
  Future<List<dynamic>> _futureMenuItemList;
  //Future<MenuItemGroupModel> _futureMenuItemGroup;
  bool _infiniteItemStop;

  //endregion

  @override
  void initState() {
    _futureMenuGroupList = fetchMenuWPList();
    _infiniteStop = false;
  }

  @override
  Widget build(BuildContext context) {
    return ClipPath(
      clipper: OvalRightBorderClipper(),
      child: Drawer(
        child: Container(
          padding: const EdgeInsets.only(left: 16.0, right: 40),
          decoration: BoxDecoration(
              color: primaryColor,
              boxShadow: [BoxShadow(color: Colors.black45)]),
          width: 300,
          child: SafeArea(
            child: SingleChildScrollView(
              child: Column(
                children: <Widget>[
                  Container(
                    padding: const EdgeInsets.symmetric(vertical: 5.0),
                    child: InkWell(
                      onTap: () {
                        //Navigator.push( context, MaterialPageRoute(builder: (context) => PageHomeContent(),),);
                        Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new PageHomeContent()),)
                            .then((val)=>{ new MainPage() });
                      },
                      child:
                      Column(
                        children: <Widget>[
                          Row(
                              children: [
                                Icon(
                                  Icons.format_list_bulleted,
                                  color: activeColor,
                                ),
                                SizedBox(width: 10.0),
                                Text("Home Content",  ),
                                Spacer(),
                              ]
                          ),
                        ],
                      ),

                    ),
                  ),
                  Divider(
                    color: dividerColor,
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
//end Class

//region [ MENU ITEM PAGE ]

//endregion

主页类[MainPage]

class MainPage extends StatefulWidget {
  //MainPage({Key key, this.title}): super(key: key);
  //final String title;

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

class _MainPageState extends State<WPMainPage> {

  //region [ ATTRIBUTS ]
  List<dynamic> featuredArticles = [];
  List<dynamic> latestArticles = [];
  List<dynamic> pageList = [];
  List<dynamic> menuGroupList = [];
  List<dynamic> categoryHomeList = [];

  Future<List<dynamic>> _futurePageList;
  Future<List<dynamic>> _futureFeaturedArticles;
  Future<List<dynamic>> _futureLastestArticles;
  Widget widgetCategoryBuilder=new Container();

  final _categoryRepository = CategoryRepository();

  ScrollController _controller;
  int page = 1;
  bool _showLoadingPage = true;
  bool _showLoadingCategoryHome = true;
  bool _infiniteStop;
  double heightNoInternet = 280.0;

  // Firebase Cloud Messeging setup
  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  //endregion

  @override
  void initState() {
    super.initState();
    _futureFeaturedArticles = fetchFeaturedArticles(1);
    _futureLastestArticles = fetchLatestArticles(1);
    _futurePageList = fetchPageList();
    getCategoriesOnLocal();

    _controller = ScrollController(initialScrollOffset: 0.0, keepScrollOffset: true);
    _controller.addListener(_scrollListener);

    _infiniteStop = false;
  }

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


  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(Constant.APP_NAME_LONG),
          actions: getActionAppBarButton(context: context),
        ),
        drawer: BuildDrawer(),
        body: Container(
          decoration: BoxDecoration(color: Colors.white70),
          child: SingleChildScrollView(
            controller: _controller,
            scrollDirection: Axis.vertical,
            child: Column(
                children:
                getWidgetList()
            ),
          ),
        ));
  }


  getRefreshRequests() async {
    getCategoriesOnLocal();
    //Tools.mySnackBar(context, ' m s g TEST 1 ');
  }

  getWidgetList() {
    List<Widget> itemList = new List<Widget>();

    itemList.add(
        new Column(
          children: <Widget>[

            new RaisedButton(
              onPressed: ()=>
                  Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new PageHomeContent()),)
                      .then((val)=>{ getRefreshRequests() }),
              child: Text('Refresh', style: TextStyle(color: Colors.white), ), color: Colors.purple,
              elevation: 2.0,
            ),

          ],
        )

    );

    itemList.add(
        getPagebuilderList(isShowTitle: false)
    );

    itemList.add(
        featuredPostBuildSlider(_futureFeaturedArticles)
    );

    /*itemList.add(
      featuredPost(_futureFeaturedArticles),
    );*/
    itemList.add(
        widgetCategoryBuilder
    );


    itemList.add(
        latestPosts(_futureLastestArticles)
    );

    return itemList;
  }

  _scrollListener() {
    var isEnd = _controller.offset >= _controller.position.maxScrollExtent &&
        !_controller.position.outOfRange;
    if (isEnd) {
      setState(() {
        page += 1;
        _futureLastestArticles = fetchLatestArticles(page);
      });
    }
  }

  //region [ ALL POST | RECENTS POST ]
  //endregion

  //region [ POST FEATURED | Swiper ]
  //endregion

  //region [ PAGES ]
  //endregion

  //region [ CATEGORIES LOCAL --> ON LIGNE ]
  void getCategoriesOnLocal() async {
    try {
      await _categoryRepository.getCategories().then((itemList) {
        if (itemList != null) {
          setState(() {
            categoryHomeList = itemList;
          });
          getCategoryBuilder();
        }
      });
    } catch (e) {
      Tools.println("Error: getCategoriesOnLocal: $e");
    }
  }
  getCategoryBuilder() {
    List<Widget> itemWidgetList=[];
    if(  _showLoadingCategoryHome) {
      if (categoryHomeList.length > 0) {
        for (Category category in categoryHomeList) {
          if (category.count > 0) {
            itemWidgetList.add(
                getItemArticle(category: category)
            );
          }
        }
        widgetCategoryBuilder=  Column( children: itemWidgetList );
      } else {
        widgetCategoryBuilder=  Container();
      }
    } else {
      widgetCategoryBuilder= Container();
    }
    setState(() {
      widgetCategoryBuilder = widgetCategoryBuilder;
    });
    return widgetCategoryBuilder;
  }
  Widget getItemArticle({Category category}) {
    return
      Column(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(left: 8.0, right: 8.0),
            child: Row(
              children: <Widget>[
                Text('${category.name}',
                  style: homeTitleTextStyle,
                  textAlign: TextAlign.left,),
                Spacer(),
                InkWell(
                  onTap: (){
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => CategoryArticles(category.id, category.name),
                      ),
                    );
                  },
                  child:  Text('See More',
                    textAlign: TextAlign.right,
                    style: TextStyle(color: Colors.red),),
                ),

              ],),
          ),
          new CategoryHomeBuilder( categorieId: category.id),
        ],
      );
  }
//endregion

}

有没有人有建议。

感谢您的帮助

【问题讨论】:

    标签: android flutter dart


    【解决方案1】:

    当您从导航器返回时,您必须刷新页面,只需放置 setState(getRefreshRequests()),这是因为页面不知道您在屏幕上放置了一个新的小部件

    【讨论】:

      【解决方案2】:

      等待更好的回应。

      我在主类中用getBuildDrawer() 方法替换了BuildDrawer 类。

      它工作得很好,但我更愿意把它放在一个单独的类中,这样我就可以在另一个页面中使用它......

      getBuildDrawer() {
          return ClipPath(
            clipper: OvalRightBorderClipper(),
            child: Drawer(
              child: Container(
                padding: const EdgeInsets.only(left: 16.0, right: 40),
                decoration: BoxDecoration(
                    color: primaryColor,
                    boxShadow: [BoxShadow(color: Colors.black45)]),
                width: 300,
                child: SafeArea(
                  child: SingleChildScrollView(
                    child: Column(
                      children: <Widget>[
                        Container(
                          padding: const EdgeInsets.symmetric(vertical: 5.0),
                          child: InkWell(
                            onTap: () {
                              Navigator.of(context).pop();
            Navigator.of(context).push(new MaterialPageRoute(builder: (_)=>new PageHomeContent()),)
                .then((val)=>{ getRefreshRequests() });
                            },
                            child:
                            Column(
                              children: <Widget>[
                                Row(
                                    children: [
                                      Icon(
                                        Icons.format_list_bulleted,
                                        color: activeColor,
                                      ),
                                      SizedBox(width: 10.0),
                                      Text("Home Content",  ),
                                      Spacer(),
                                    ]
                                ),
                              ],
                            ),
      
                          ),
                        ),
                        Divider(
                          color: dividerColor,
                        ),
                      ],
                    ),
                  ),
                ),
              ),
            ),
          );
        }
      

      【讨论】:

      • 我只想说我处于确切的情况。我即将把我的抽屉变成同一个班级的一个方法——但必须有更好的方法吗?你有没有发现一个?谢谢!!
      猜你喜欢
      • 2021-05-06
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多