【问题标题】:setState not updating widget saved in variablesetState 不更新保存在变量中的小部件
【发布时间】:2021-07-28 14:51:42
【问题描述】:
class _OrdersState extends State<Orders> {
  Map<String, List<Order>> queryResults = defaultResponse;

  apiCall(){
    setState(() {
            queryResults = resultFromAPI;
     });
  }

  Widget build(BuildContext context) {
   
   Widget homePage = OrdersHome(
      futureOrders: queryResults["futureOrders"] ?? [],
      newOrders: queryResults["newOrders"] ?? [],
      processingOrders: queryResults["processingOrders"] ?? [],
      readyOrders: queryResults["readyOrders"] ?? [],
    );

    print(queryResults["futureOrders"]);

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        automaticallyImplyLeading: false,
        title: Header(navigatorKey: navigatorKey),
      ),
      body: Navigator(
        key: navigatorKey,
        initialRoute: curRoute,
        onGenerateInitialRoutes: (navigator, name) {
          return [
            MaterialPageRoute(builder: (context) {
              return homePage;
            })
          ];
        },
        onGenerateRoute: (settings) {
         

          if (routeName?.startsWith(RouteNames.ORDERS_PREFIX) ?? false) {
            Widget page = homePage;
            switch (routeName) {
              case RouteNames.ORDERS_HOME:
                page = homePage;
                break;
             // other routes
            }

            return MaterialPageRoute(builder: (context) {
              return page;
            });
          } else {
            print('route not found');
           return MaterialPageRoute(builder: (context) {
              return homePage;
            });
          }
        },
      ),
    );
  }
}

我在多个地方使用 OrdersHome() 以避免代码重复,我将其声明为变量并在 UI 中使用变量。但是当状态更新时,传入的变量不会更新。print 语句显示状态已更新并再次调用 build。如果我不使用该变量并在它工作的任何地方复制该代码。有什么解决办法吗?

【问题讨论】:

  • 您正在使用 setState 这就是它没有改变的原因。当你改变屏幕时,它会失去它的状态并恢复到默认值。因此,您必须使用 Provider、mobX、bloc、riverpod 等状态管理技术之一来克服这个问题。

标签: flutter dart widget flutter-layout


【解决方案1】:

您需要将初始值放入 InitState。试试这个:

class _OrdersState extends State<Orders> {
  
late Map<String, List<Order>> queryResults;

  @override
  void initState() {
    queryResults = defaultResponse;
    super.initState();
  }

  apiCall(){
    setState(() {
            queryResults = resultFromAPI;
     });
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多