我有一个根类RootPage,它是一个始终在视图中的StatefulWidget.我想把由RootPage's currentPage Widget控制的body in RootPage换成不同的类,比如我的FeedPage类和我做的任何其他类?

示例代码

import 'package:flutter/material.dart';

class RootPage extends StatefulWidget {
  @override
  _RootPageState createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
  FeedPage feedPage;

  Widget currentPage;

  @override
  void initState() {
    super.initState();
    feedPage = FeedPage();

    currentPage = feedPage;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      //Current page to be changed from other classes too?
      body: currentPage
    );
  }
}



class FeedPage extends StatefulWidget {
  @override
  _feedPageState createState() => new _feedPageState();
}
class _feedPageState extends State<FeedPage> {

  @override
  Widget build(BuildContext context) {
    return new FlatButton(
      onPressed: () {
        setState(() {
          //change the currentPage in RootPage so it switches FeedPage away and gets a new class that I'll make
        });
      },
      child: new Text('Go to a new page but keep root, just replace this feed part'),
    );
  }
}

我确信有一个显而易见的答案,但是我似乎想不出如何有效地做到这一点,所以很容易集成future 的类,并始终关注我的根(My Root).

推荐答案

你可以用callbacks functions来实现这一点.请参考下面的代码.

import 'package:flutter/material.dart';

class RootPage extends StatefulWidget {
  @override
  _RootPageState createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
  FeedPage feedPage;

  Widget currentPage;

  @override
  void initState() {
    super.initState();
    feedPage = FeedPage(this.callback);

    currentPage = feedPage;
  }

  void callback(Widget nextPage) {
    setState(() {
      this.currentPage = nextPage;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      //Current page to be changed from other classes too?
        body: currentPage
    );
  }
}



class FeedPage extends StatefulWidget {
  Function callback;

  FeedPage(this.callback);

  @override
  _feedPageState createState() => new _feedPageState();
}
class _feedPageState extends State<FeedPage> {

  @override
  Widget build(BuildContext context) {
    return new FlatButton(
      onPressed: () {
        this.widget.callback(new NextPage());
//        setState(() {
//          //change the currentPage in RootPage so it switches FeedPage away and gets a new class that I'll make
//        });
      },
      child: new Text('Go to a new page but keep root, just replace this feed part'),
    );
  }
}

这与这个problem非常相似,你可以在我的回答中提到第三点.

Flutter相关问答推荐

如何使用Firebase Firestore来获取外部集合中的文档子集合中的文档

功能不起作用的Flutter 块复制

Flutter 文件拾取器Android SingleInstance模式它返回的文件路径为空

通过Ffltter应用程序与Docker服务器进行交互以进行身份验证

Flutter中的编译时间常量方法

从图标启动器打开时,VSCode未检测到Web设备

Flutter Xcode 15 错误(Xcode):DT_TOOLCHAIN_DIR 无法用于判断 LIBRARY_SEARCH_PATHS

构建上下文不能跨异步间隙使用

无法在 Flutter 项目中安装最新版本的 image_picker

没有为类型 'Widget' 定义运算符 '[]' .try 定义运算符[]

仅在获取(读取)、Provider 时,Firestore 中的数据为空

如何使用Riverpod提供程序正确构建搜索栏?

Riverpod 2.3.6:AutoDisposeNotifier和ref.onDispose自动处理

围绕父组件旋转位置组件

我想在文本结束后显示分隔线.它会在第一行、第二行或第三行结束

Flutter snapShot.hasData 为假但响应有数据

Flutter/Dart 返回_Future的实例而不是实际的字符串值

如何在 Flutter 中使用简写 IF 禁用单选按钮?

如何修复int类型不是String类型的子类型

如何在 SingleChildScrollView 小部件中管理自定义小部件状态