0

我有一个PageView.builder返回页面。每个都有一个标题和一个标签。我还有一个EditPage允许用户编辑标题。编辑后的标题通过 PHP 在 MySQL 数据库上进行更新。
我可以让单个页面自动更新为新标题吗?还是每次更新标题时都必须完全重建 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');
}
4

2 回答 2

0

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

于 2020-08-16T15:58:23.533 回答
0

虽然不完全是我想要的,但最后我还是决定让用户通过 appbar 回到更新后的页面;我发送的参数只用一个编辑过的页面重建了一个新页面。

 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,),
            ));
      },
    ),
   ),
于 2020-08-17T20:46:04.463 回答