【问题标题】:Flutter - setState Not Using New DataFlutter - setState 不使用新数据
【发布时间】:2019-02-05 06:41:33
【问题描述】:

我有一个屏幕,我可以像这样将数据传回:

final myUpdatedObject = await Navigator.of(context).push(...);
setState({
  object = myUpdatedObject;
});

在我的小部件主体的所有位置使用简单的print 检查我的对象被使用后,新数据在被Navigator 传回并调用setState 后就存在。

但是,当重新构建小部件时,即使新数据明显存在,它也不会反映在 UI 更改中,而是显示旧数据。

这是调试模式下的某种缓存吗?是什么导致了这个问题?

【问题讨论】:

  • 您是在弹出之前在新页面中创建新对象 (myUpdatedObject),还是发送具有不同值的相同对象引用?
  • 它是一个新对象。我将它转换为 Map 并返回到它的对象类,以便获得一个全新的引用。
  • 除非您向我们展示您如何使用您的地图,否则无法判断
  • 如果它是一个新的引用,它应该重新渲染小部件。你能再显示一些代码吗?

标签: caching dart widget flutter setstate


【解决方案1】:

下面的示例以名为textMessageMapMap 开头,并带有一个message 键,该键填充了带有“主页”的Text 小部件。点击FloatingActionButton,您将导航到SecondScreen。如果您点击“返回!” SecondScreen 中的按钮,textMessageMap 中的 message 键将更新为“第二屏”。如果您点击SecondScreenScaffold 上的返回按钮,textMessageMap 将被取消。调用 setState 会相应地更新 UI。看看你的实现是否不同。

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  Map<String, String> textMessageMap = {'message': 'Home'};

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(
              '${textMessageMap != null ? textMessageMap['message'] : 'map is null'}',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          _launchSecondScreen();
        },
        child: new Icon(Icons.add),
      ),
    );
  }

  _launchSecondScreen() async {
    final value = await Navigator.push(
        context,
        MaterialPageRoute<Map<String, String>>(
            builder: (BuildContext _) => SecondScreen()));
    setState(() {
      textMessageMap = value;
    });
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Screen"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            // Navigate back to the first screen by popping the current route
            // off the stack. The text 'Second Screen' will replace 'Home'.
            // If you hit the scaffold's back button, the return value will be
            // null instead.
            final map = {'message': 'Second Screen'};
            Navigator.pop(context, map);
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}

【讨论】:

    猜你喜欢
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2019-12-16
    • 2021-12-18
    • 2020-08-18
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多