【问题标题】:Updating my State after Pop from A modal bottom sheet从模态底部表弹出后更新我的状态
【发布时间】:2019-08-05 12:36:10
【问题描述】:

我使用模态底部表作为我的下拉列表,但是一旦我通过 Navigator.pop() 从底部表返回后,我无法弄清楚如何更新我的状态。显然 Modal 类不支持 setState。我很乐意接受任何人可以为这个问题提供的任何帮助。除了 selectedlang 更新的文本之外的所有内容都有效。应用程序设置的实际语言确实会改变,只是文本没有更新以向用户显示。

import 'package:flutter/material.dart';
import 'splash.dart' show lang;
import 'package:shared_preferences/shared_preferences.dart';

String selectedlang;

class LangSelect extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _LangSelectState();
}

class _LangSelectState extends State<LangSelect> {
  void setLangDefault() {
    selectedlang = "English";
    lang = 'en';
  }

  void initState() {
    super.initState();
    setLangDefault();
  }

  Modal modal = Modal();

  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,
        body: WillPopScope(
          onWillPop: () async {
            Future.value(false);
          },
          child: Column(
            children: <Widget>[
              Image.asset('assets/splash_logo.jpg'),
              Center(
                  child: Column(
                mainAxisSize: MainAxisSize.max,
                children: <Widget>[
                  Text('Welcome',
                      style:
                          TextStyle(fontSize: 40, fontWeight: FontWeight.bold)),
                  Text(''),
                  Text(''),
                  Text(
                    "Select a language.",
                    style: TextStyle(fontStyle: FontStyle.italic),
                  ),
                  Text(''),
                  Container(
                      width: 120,
                      height: 30,
                      decoration: BoxDecoration(
                          color: Colors.grey[300],
                          border: Border.all(
                              color: Colors.black,
                              width: 1,
                              style: BorderStyle.solid),
                          borderRadius: BorderRadius.all(Radius.circular(20))),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        mainAxisSize: MainAxisSize.min,
                        children: <Widget>[
                          Text(selectedlang),
                          IconButton(
                            padding: EdgeInsets.fromLTRB(25, 2, 2, 2),
                            icon: Icon(Icons.arrow_drop_down),
                            onPressed: () => modal.mainBottomSheet(context),
                          )
                        ],
                      ))
                ],
              )),
            ],
          ),
        ));
  }
}

class Modal {
  mainBottomSheet(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (BuildContext context) {
          return Column(
            mainAxisSize: MainAxisSize.min,
            children: <Widget>[
              _createTile(context, 'English', _action1),
              _createTile(context, 'Español', _action2),
            ],
          );
        });
  }

  ListTile _createTile(BuildContext context, String name, Function action) {
    return ListTile(
      title: Text(
        name,
        textAlign: TextAlign.center,
      ),
      onTap: () {
        Navigator.pop(context);
        action();
      },
    );
  }

  _action1() {
    lang = 'en';
    selectedlang = "English";
    print(lang);
  }

  _action2() {
    lang = 'sp';
    selectedlang = "Español";
    print(lang);
  }
}

【问题讨论】:

    标签: dart flutter bottom-sheet stateful


    【解决方案1】:

    我通过简单地从 Modal 类中删除 mainBottomSheet 解决了这个问题,就像 onPressed ()=> void 一样。然后我可以将我的 setState 放入我的操作中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2022-06-10
      • 2020-10-04
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      相关资源
      最近更新 更多