Flutter / Dart-编辑后自动在内置页面视图上更新标题吗?

问题描述

我有一个PageView.builder返回页面。每个都有一个标题一个标签。 我还有一个EditPage,可让用户编辑标题。 编辑后的标题通过MysqL数据库上的PHP更新。
我可以使单个页面自动更新为新标题吗? 还是在每次更新标题时都必须完全重建PageView?

这是PageView.builder代码

class StageBuilder extends StatelessWidget {
  final List<SpeakContent> speakcrafts;

  StageBuilder(this.speakcrafts);

  @override
  Widget build(context) {
    return PageView.builder(
      itemCount: speakcrafts.length,itemBuilder: (context,int currentIndex) {
        return createViewItem(speakcrafts[currentIndex],context);
      },);
  }

  Widget createViewItem(SpeakContent speakcraft,BuildContext context) {

    return Column(
      children: <Widget>[
        Row(
          mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
            Text(
              speakcraft.title,),],Row(
          mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
            Text(
              speakcraft.tagname,);
  }
}

这是发布到PHP / MysqL数据库代码

Future<String> titleUpdate({String opid,String title}) async {
  String upDateUrl;
  upDateUrl = "http://example.com?title=" + title;

  final response = await get(upDateUrl);

  if (response.statusCode == 200) {
    print(response.body);
    return response.body;
  } else
    throw Exception('We were not able to successfully update the title');
}

解决方法

ListView的语法为: List test = new List<GlobalKey<FormState>>(speakCreafts.length);

您的createViewItem如下:

  return Form(
    key: test[currentIndex],child: createViewItem(speakcrafts[currentIndex],context),);      
  },

是的,items是您拥有的createViewItems的数量。

要重建页面,您必须使用相同的引用调用相同的setState:

test[index].currentState.setState(() {});

感谢@Meggy! XD

,

尽管不完全是我想要的,但最终,我决定允许用户通过应用程序栏返回到更新的页面;我发送的参数仅用一个已编辑的页面重建了一个新页面。

 appBar: AppBar(
    title: Text(
      "Back to edited page",style: TextStyle(
        fontSize: 14,color: Colors.blueGrey,),leading: new IconButton(
      icon: new Icon(
        Icons.arrow_back,color: Colors.white,onPressed: () {
        Navigator.push(
            context,PageTransition(
              type: PageTransitionType.downToUp,child: HomePage(stagetype: 'edit',currentaudioid: widget.opid,));
      },