【问题标题】:How to update screen in flutter如何在颤动中更新屏幕
【发布时间】:2020-12-12 09:11:07
【问题描述】:

我遇到了颤振问题。 之后我想尝试更新我的屏幕

setState(() => {
   widgetScreenBuilder = screenWidgets[currentScreen]
});

在我的类别选择器中已被调用。我试图做到这一点,所以我有一个主屏幕,它具有我的类别选择器的功能,然后我希望将当前屏幕/小部件作为一项功能。然后我可以通过更改功能来更改选择器下方的屏幕/小部件。更改功能后,我找不到刷新页面/主屏幕正文的方法(类别选择器下方的小部件)

我的主屏幕:

import 'package:flutter/material.dart';
import 'package:app/widgets/categorySelector.dart';
import 'package:app/data/appData.dart';

class MainScreen extends StatefulWidget {
    @override
    _MainScreen createState() => _MainScreen();
}

class _MainScreen extends State<MainScreen> {
  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
      backgroundColor: Theme.of(context).primaryColorDark,
      appBar: AppBar(
        backgroundColor: Theme.of(context).primaryColorDark,
        elevation: 0.0,
        title: Center(
          child: Text(
            "Tournaments",
            style: TextStyle(
              fontWeight: FontWeight.bold,
              fontSize: 26.0,
              letterSpacing: 1.1
              )
          ),
        ),
      ),
      body: Column(
        children: <Widget>[
          CategorySelector(),
          widgetScreenBuilder
        ],
      ),
    );
  }
}

我的类别选择器:

import 'package:app/data/appData.dart';
import 'package:flutter/material.dart';

class CategorySelector extends StatefulWidget {
  @override
  _CategorySelectorState createState() => _CategorySelectorState();
}

class _CategorySelectorState extends State<CategorySelector> {
  final List<String> categories = ['All games', 'New game', "New player", "Top players"];
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 75.0,
      color: Theme.of(context).primaryColorDark,
      child: ListView.builder(
        scrollDirection: Axis.horizontal,
        itemCount: categories.length,
        itemBuilder: (BuildContext context, int index) {
          return GestureDetector(
            onTap: () {
              if (currentScreen != index) {
                currentScreen = index;
                setState(() => {
                  widgetScreenBuilder = screenWidgets[currentScreen]
                });
              }
            }, 
              child: Center(
                child: Padding(
                padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0),
                child: Text(
                  categories[index],
                  style: TextStyle(
                    fontSize: 24.0,
                    fontWeight: FontWeight.bold,
                    letterSpacing: 1.2,
                    color: index == currentScreen ? Colors.white : Colors.white50
                  )
                )
            ),
              ),
          );
        }

        )
    );
  }
}

widgetScreenBuilder、screenWidgets和currentScreen所在的appData.dart文件:

import 'package:app/widgets/allGames.dart';

int currentScreen = 0;
List screenWidgets = [AllGames(), NewGame()];
var widgetScreenBuilder = screenWidgets[currentScreen];

我是应用程序开发、飞镖和颤振的新手,因此我们将不胜感激! 谢谢

【问题讨论】:

标签: android ios flutter dart


【解决方案1】:

我不能很好地理解你的问题, 但我认为你应该尝试 didChangeDependencies 检查它:https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html

【讨论】:

    【解决方案2】:

    将您的 MainScreen 类更改为:

    class MainScreen extends StatefulWidget {
        @override
        _MainScreen createState() => _MainScreen();
      }
      
      class _MainScreen extends State<MainScreen> {
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            backgroundColor: Theme.of(context).primaryColorDark,
            appBar: AppBar(
              backgroundColor: Theme.of(context).primaryColorDark,
              elevation: 0.0,
              title: Center(
                child: Text("Tournaments",
                    style: TextStyle(
                        fontWeight: FontWeight.bold,
                        fontSize: 26.0,
                        letterSpacing: 1.1)),
              ),
            ),
            body: CategorySelector(), // delete column and just put CategorySelector()
          );
        }
      }
    

    并将您的 CategorySelector 类更改为:

    class CategorySelector extends StatefulWidget {
          @override
          _CategorySelectorState createState() => _CategorySelectorState();
        }
        
        class _CategorySelectorState extends State<CategorySelector> {
          final List<String> categories = [
            'All games',
            'New game',
            "New player",
            "Top players"
          ];
        
          @override
          Widget build(BuildContext context) {
            return Column(
              children: <Widget>[
                Container(
                  height: 75.0,
                  color: Theme.of(context).primaryColorDark,
                  child: ListView.builder(
                    scrollDirection: Axis.horizontal,
                    itemCount: categories.length,
                    itemBuilder: (BuildContext context, int index) {
                      return GestureDetector(
                        onTap: () {
                          if (currentScreen != index) {
                            currentScreen = index;
                            setState(
                              () =>
                                  {widgetScreenBuilder = screenWidgets[currentScreen]},
                            );
                          }
                        },
                        child: Center(
                          child: Padding(
                            padding:
                                EdgeInsets.symmetric(horizontal: 20.0, vertical: 20.0),
                            child: Text(
                              categories[index],
                              style: TextStyle(
                                  fontSize: 24.0,
                                  fontWeight: FontWeight.bold,
                                  letterSpacing: 1.2,
                                  color: index == currentScreen
                                      ? Colors.white
                                      : Colors.white54),
                            ),
                          ),
                        ),
                      );
                    },
                  ),
                ),
                widgetScreenBuilder, // add widgetScreenBuilder here
              ],
            );
          }
        }
    

    您的代码现在可以正常工作了 :)

    setState() 只能在自己的类中进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-29
      • 2022-01-25
      • 2020-06-01
      • 2020-02-08
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多