如何防止 TextFormField 重定向到上一个屏幕?

发布于 2025-01-11 19:26:09 字数 14892 浏览 0 评论 0原文

我正在尝试创造形式。 我设法在其中创建每个小部件,但每次我尝试打开 TextFormField 时,我都会被重定向回 MainMenuScreen,没有任何错误。

我正在使用 BLoC 和路线。我认为这个问题可能与使用命名路由有关。 在更改为命名路由之前未发现问题

MainMenuScreen 片段:

           CategoryCard(
              categoryName: 'Main dishes',
              assetPath: 'assets/images/main_dish.png',
              onPressed: () => Navigator.pushReplacement(context,
                  MaterialPageRoute(builder: (BuildContext context) {
                return BlocProvider.value(
                  value: BlocProvider.of<RecipesBloc>(context)
                    ..add(LoadRecipesEvent())
                    ..category = 'main_dish',
                  child: RecipesScreen(),
                );
              })),
            ),

从 MainMenuScreen 我重定向到 RecipesScreen

RecipesScreen 片段并重定向到 RecipeCreateForm:

      floatingActionButton: FloatingActionButton(
        onPressed: () => Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (BuildContext context) {
            return RecipeCreateForm();
          }),
        ),

然后我重定向到 RecipeCreateForm我正在使用 TextFormFields 的地方。 每当我尝试使用 TextFormField 时,我都会被重定向回 MainMenuScreen。

class RecipeCreateForm extends StatefulWidget {
  @override
  _RecipeCreateFormState createState() => _RecipeCreateFormState();
}

class _RecipeCreateFormState extends State<RecipeCreateForm> {
  final _recipeNameController = TextEditingController();
  final _imageUrl = TextEditingController();
  String? _difficultyValue;
  late int _ingredientsQuantity;
  late int _preparationStepsQuantity;
  late List<Ingredient> _ingredientsValues;
  late List<PreparationStep> _preparationStepsValues;
  late double _preparationTime;
  String? _portions;

  @override
  void initState() {
    _ingredientsQuantity = 1;
    _preparationStepsQuantity = 1;
    _ingredientsValues = [];
    _preparationStepsValues = [];
    _preparationTime = 0;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: true,
      appBar: AppBar(
        leading: IconButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          icon: Icon(
            Icons.arrow_back,
            color: Colors.white,
          ),
        ),
      ),
      body: Scrollbar(
        thickness: 10,
        hoverThickness: 2,
        child: SingleChildScrollView(
          child: Container(
            color: Colors.lightGreen.shade100,
            child: Column(
              children: <Widget>[
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Recipe name',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                TextFormField(
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  controller: _recipeNameController,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Image',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                TextFormField(
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  controller: _imageUrl,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Difficulty',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                DropdownButton(
                  hint: _difficultyValue == null
                      ? Text(
                          'Select difficulty',
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        )
                      : Text(
                          _difficultyValue!,
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  items: ['Easy', 'Medium', 'Hard'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _difficultyValue = val as String;
                      },
                    );
                  },
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Preparation time',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                Slider(
                  value: _preparationTime,
                  onChanged: (newPreparationTime) {
                    setState(() => _preparationTime = newPreparationTime);
                  },
                  label: _preparationTime.toStringAsFixed(0),
                  min: 0,
                  max: 360,
                  divisions: 24,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Ingredients',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                SizedBox(
                  height: 175,
                  child: Scrollbar(
                    child: ListView.builder(
                        itemCount: _ingredientsQuantity,
                        itemBuilder: (context, index) {
                          return _ingredientRow(index);
                        }),
                  ),
                ),
                Row(
                  children: [
                    IconButton(
                        icon: Icon(Icons.add),
                        onPressed: () async {
                          setState(() {
                            _ingredientsQuantity++;
                          });
                        }),
                    IconButton(
                        icon: Icon(Icons.delete),
                        onPressed: () async {
                          setState(() {
                            _ingredientsQuantity = 1;
                            _ingredientsValues.clear();
                          });
                        })
                  ],
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Preparation steps',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                Scrollbar(
                  child: SizedBox(
                    height: 100,
                    child: ListView.builder(
                        shrinkWrap: true,
                        itemCount: _preparationStepsQuantity,
                        itemBuilder: (context, index) {
                          return _preparationStepRow(index);
                        }),
                  ),
                ),
                Row(
                  children: [
                    IconButton(
                        icon: Icon(Icons.add),
                        onPressed: () async {
                          setState(() {
                            _preparationStepsQuantity++;
                          });
                        }),
                    IconButton(
                        icon: Icon(Icons.delete),
                        onPressed: () async {
                          setState(() {
                            _preparationStepsQuantity = 1;
                            _preparationStepsValues.clear();
                          });
                        }),
                  ],
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Portions',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                DropdownButton(
                  hint: _portions == null
                      ? Text(
                          'Select number of portions',
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        )
                      : Text(
                          _portions!,
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  items: ['1', '2', '3', '4', '5', '6', '7'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _portions = val as String;
                      },
                    );
                  },
                ),
                ElevatedButton(
                  onPressed: () {
                    BlocProvider.of<RecipesBloc>(context).add(
                      AddRecipeEvent(
                        Recipe(
                          name: _recipeNameController.text,
                          image:
                              'https://www.thespruceeats.com/thmb/dA8o8EZpjJyeocYZNpzfknoKh2s=/4351x3263/smart/filters:no_upscale()/baked-stuffed-potatoes-482217-hero-01-850f2d87fe80403f923e140dbf5f1bf3.jpg',
                          ingredients: _ingredientsValues,
                          difficulty: _difficultyValue,
                          preparationTime: _preparationTime,
                          preparationSteps: _preparationStepsValues,
                          type: BlocProvider.of<RecipesBloc>(context)
                              .category
                              .toString(),
                          portions: _portions,
                        ),
                      ),
                    );
                    Navigator.of(context).pop();
                  },
                  child: Text('Submit'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  _ingredientRow(int key) {
    return IntrinsicHeight(
      child: Row(
        children: [
          Padding(padding: EdgeInsets.only(left: 10)),
          SizedBox(
            width: 225,
            child: TextFormField(
              maxLength: 35,
              onChanged: (val) {
                setState(() {
                  _onIngredientUpdate(key,name: val);
                });
              },
            ),
          ),
          VerticalDivider(
            width: 20,
            thickness: 1,
            color: Colors.black,
            indent: 30,
            endIndent: 10,
          ),
          SizedBox(
            width: 55,
            child: TextFormField(
              maxLength: 7,
              initialValue: '0',
              onChanged: (val) {
                setState(() {
                  _onIngredientUpdate(key, quantity: val);
                });
              },
            ),
          ),
          Padding(padding: EdgeInsets.only(left: 10)),
          DropdownButton(
            hint: Text('pcs'),
            items: ['pcs', 'ml', 'g'].map(
              (val) {
                return DropdownMenuItem<String>(
                  value: val,
                  child: Text(val),
                );
              },
            ).toList(),
            onChanged: (val) {
              setState(() {
                _onIngredientUpdate(key,measurement: val.toString());
              });
            },
          )
        ],
      ),
    );
  }

  _onIngredientUpdate(int key, {String? name, String? measurement, String? quantity}) {
    int foundKey = -1;
    _ingredientsValues.forEach((element) {
      if (element.id.contains(key.toString())) {
        foundKey = key;
      }
    });

    if (-1 != foundKey) {
      _ingredientsValues.removeWhere((map) {
        return map.id == foundKey.toString();
      });
    }
    Map<String, dynamic> json = {'id': key, 'name': name, 'measurement': measurement, 'quantity':quantity};
    _ingredientsValues.add(json as Ingredient);
  }

  _preparationStepRow(int key) {
    return IntrinsicHeight(
      child: Row(
        children: [
          Padding(padding: EdgeInsets.only(left: 10)),
          SizedBox(
            width: 225,
            height: 50,
            child: TextFormField(
              maxLength: 35,
              onChanged: (val) => {
                _onPreparationUpdate(key,val)
              },
            ),
          ),
        ],
      ),
    );
  }

  _onPreparationUpdate(int key, String val) {
    int foundKey = -1;
    _preparationStepsValues.forEach((element) {
      if (element.id.contains(key.toString())) {
        foundKey = key;
      }
    });

    if (-1 != foundKey) {
      _preparationStepsValues.removeWhere((map) {
        return map.id == foundKey.toString();
      });
    }
    Map<String, dynamic> json = {'id': key, 'step': val};
    _preparationStepsValues.add(json as PreparationStep);
  }
}

问题 GIF:

问题

编辑: 问题与形式无关。我只用一个字段替换了整个表单,没有任何逻辑,问题仍然存在。 这可能与命名路由有关。

I am trying to create form.
I managed to create every widget in it, but every time I try to open TextFormField I get redirected back to my MainMenuScreen without any error.

I am using BLoC and routes. I think that issue might be related with using named routes.
Issue was not spotted before changing to named routes

MainMenuScreen fragment:

           CategoryCard(
              categoryName: 'Main dishes',
              assetPath: 'assets/images/main_dish.png',
              onPressed: () => Navigator.pushReplacement(context,
                  MaterialPageRoute(builder: (BuildContext context) {
                return BlocProvider.value(
                  value: BlocProvider.of<RecipesBloc>(context)
                    ..add(LoadRecipesEvent())
                    ..category = 'main_dish',
                  child: RecipesScreen(),
                );
              })),
            ),

From MainMenuScreen I redirect to RecipesScreen

Fragment of RecipesScreen with redirect to RecipeCreateForm:

      floatingActionButton: FloatingActionButton(
        onPressed: () => Navigator.pushReplacement(
          context,
          MaterialPageRoute(builder: (BuildContext context) {
            return RecipeCreateForm();
          }),
        ),

and then I redirect to RecipeCreateForm where I'm using TextFormFields.
Whenever I try to use TextFormField I get redirected back to MainMenuScreen.

class RecipeCreateForm extends StatefulWidget {
  @override
  _RecipeCreateFormState createState() => _RecipeCreateFormState();
}

class _RecipeCreateFormState extends State<RecipeCreateForm> {
  final _recipeNameController = TextEditingController();
  final _imageUrl = TextEditingController();
  String? _difficultyValue;
  late int _ingredientsQuantity;
  late int _preparationStepsQuantity;
  late List<Ingredient> _ingredientsValues;
  late List<PreparationStep> _preparationStepsValues;
  late double _preparationTime;
  String? _portions;

  @override
  void initState() {
    _ingredientsQuantity = 1;
    _preparationStepsQuantity = 1;
    _ingredientsValues = [];
    _preparationStepsValues = [];
    _preparationTime = 0;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: true,
      appBar: AppBar(
        leading: IconButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          icon: Icon(
            Icons.arrow_back,
            color: Colors.white,
          ),
        ),
      ),
      body: Scrollbar(
        thickness: 10,
        hoverThickness: 2,
        child: SingleChildScrollView(
          child: Container(
            color: Colors.lightGreen.shade100,
            child: Column(
              children: <Widget>[
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Recipe name',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                TextFormField(
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  controller: _recipeNameController,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Image',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                TextFormField(
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  controller: _imageUrl,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Difficulty',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                DropdownButton(
                  hint: _difficultyValue == null
                      ? Text(
                          'Select difficulty',
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        )
                      : Text(
                          _difficultyValue!,
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  items: ['Easy', 'Medium', 'Hard'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _difficultyValue = val as String;
                      },
                    );
                  },
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Preparation time',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                Slider(
                  value: _preparationTime,
                  onChanged: (newPreparationTime) {
                    setState(() => _preparationTime = newPreparationTime);
                  },
                  label: _preparationTime.toStringAsFixed(0),
                  min: 0,
                  max: 360,
                  divisions: 24,
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Ingredients',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                SizedBox(
                  height: 175,
                  child: Scrollbar(
                    child: ListView.builder(
                        itemCount: _ingredientsQuantity,
                        itemBuilder: (context, index) {
                          return _ingredientRow(index);
                        }),
                  ),
                ),
                Row(
                  children: [
                    IconButton(
                        icon: Icon(Icons.add),
                        onPressed: () async {
                          setState(() {
                            _ingredientsQuantity++;
                          });
                        }),
                    IconButton(
                        icon: Icon(Icons.delete),
                        onPressed: () async {
                          setState(() {
                            _ingredientsQuantity = 1;
                            _ingredientsValues.clear();
                          });
                        })
                  ],
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Preparation steps',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                Scrollbar(
                  child: SizedBox(
                    height: 100,
                    child: ListView.builder(
                        shrinkWrap: true,
                        itemCount: _preparationStepsQuantity,
                        itemBuilder: (context, index) {
                          return _preparationStepRow(index);
                        }),
                  ),
                ),
                Row(
                  children: [
                    IconButton(
                        icon: Icon(Icons.add),
                        onPressed: () async {
                          setState(() {
                            _preparationStepsQuantity++;
                          });
                        }),
                    IconButton(
                        icon: Icon(Icons.delete),
                        onPressed: () async {
                          setState(() {
                            _preparationStepsQuantity = 1;
                            _preparationStepsValues.clear();
                          });
                        }),
                  ],
                ),
                Padding(
                  padding: EdgeInsets.only(top: 15),
                ),
                Text(
                  'Portions',
                  style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
                ),
                DropdownButton(
                  hint: _portions == null
                      ? Text(
                          'Select number of portions',
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        )
                      : Text(
                          _portions!,
                          style: TextStyle(
                              color: Colors.black,
                              fontSize: 18,
                              fontStyle: FontStyle.italic),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(
                      color: Colors.black,
                      fontSize: 18,
                      fontStyle: FontStyle.italic),
                  items: ['1', '2', '3', '4', '5', '6', '7'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _portions = val as String;
                      },
                    );
                  },
                ),
                ElevatedButton(
                  onPressed: () {
                    BlocProvider.of<RecipesBloc>(context).add(
                      AddRecipeEvent(
                        Recipe(
                          name: _recipeNameController.text,
                          image:
                              'https://www.thespruceeats.com/thmb/dA8o8EZpjJyeocYZNpzfknoKh2s=/4351x3263/smart/filters:no_upscale()/baked-stuffed-potatoes-482217-hero-01-850f2d87fe80403f923e140dbf5f1bf3.jpg',
                          ingredients: _ingredientsValues,
                          difficulty: _difficultyValue,
                          preparationTime: _preparationTime,
                          preparationSteps: _preparationStepsValues,
                          type: BlocProvider.of<RecipesBloc>(context)
                              .category
                              .toString(),
                          portions: _portions,
                        ),
                      ),
                    );
                    Navigator.of(context).pop();
                  },
                  child: Text('Submit'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  _ingredientRow(int key) {
    return IntrinsicHeight(
      child: Row(
        children: [
          Padding(padding: EdgeInsets.only(left: 10)),
          SizedBox(
            width: 225,
            child: TextFormField(
              maxLength: 35,
              onChanged: (val) {
                setState(() {
                  _onIngredientUpdate(key,name: val);
                });
              },
            ),
          ),
          VerticalDivider(
            width: 20,
            thickness: 1,
            color: Colors.black,
            indent: 30,
            endIndent: 10,
          ),
          SizedBox(
            width: 55,
            child: TextFormField(
              maxLength: 7,
              initialValue: '0',
              onChanged: (val) {
                setState(() {
                  _onIngredientUpdate(key, quantity: val);
                });
              },
            ),
          ),
          Padding(padding: EdgeInsets.only(left: 10)),
          DropdownButton(
            hint: Text('pcs'),
            items: ['pcs', 'ml', 'g'].map(
              (val) {
                return DropdownMenuItem<String>(
                  value: val,
                  child: Text(val),
                );
              },
            ).toList(),
            onChanged: (val) {
              setState(() {
                _onIngredientUpdate(key,measurement: val.toString());
              });
            },
          )
        ],
      ),
    );
  }

  _onIngredientUpdate(int key, {String? name, String? measurement, String? quantity}) {
    int foundKey = -1;
    _ingredientsValues.forEach((element) {
      if (element.id.contains(key.toString())) {
        foundKey = key;
      }
    });

    if (-1 != foundKey) {
      _ingredientsValues.removeWhere((map) {
        return map.id == foundKey.toString();
      });
    }
    Map<String, dynamic> json = {'id': key, 'name': name, 'measurement': measurement, 'quantity':quantity};
    _ingredientsValues.add(json as Ingredient);
  }

  _preparationStepRow(int key) {
    return IntrinsicHeight(
      child: Row(
        children: [
          Padding(padding: EdgeInsets.only(left: 10)),
          SizedBox(
            width: 225,
            height: 50,
            child: TextFormField(
              maxLength: 35,
              onChanged: (val) => {
                _onPreparationUpdate(key,val)
              },
            ),
          ),
        ],
      ),
    );
  }

  _onPreparationUpdate(int key, String val) {
    int foundKey = -1;
    _preparationStepsValues.forEach((element) {
      if (element.id.contains(key.toString())) {
        foundKey = key;
      }
    });

    if (-1 != foundKey) {
      _preparationStepsValues.removeWhere((map) {
        return map.id == foundKey.toString();
      });
    }
    Map<String, dynamic> json = {'id': key, 'step': val};
    _preparationStepsValues.add(json as PreparationStep);
  }
}

Issue GIF:

Issue

EDIT:
Issue is not related with form. I have replaced whole form with only one field without any logic and issue remains.
It is probably related to named routes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没有你 2025-01-18 19:26:09

正如我所想,问题与命名路由的使用有关。
我设法通过使用 Future.delayed 和 pushNamedAndRemoveUntil 来绕过这个问题。

在 main_menu_screen 中,我创建了方法,后来用它来重定向到类别。

void redirectToCategory(BuildContext context, String categoryName) {
Future.delayed(Duration.zero, () {
  Navigator.pushNamedAndRemoveUntil(
    context,
    '/recipeScreen',
    (_) => false,
    arguments: BlocProvider.value(
      value: BlocProvider.of<RecipesBloc>(context)
        ..add(LoadRecipesEvent())
        ..category = categoryName,
      child: RecipesScreen(),
    ),
  );
});

As I was thinking, issue was related with usage of named routes.
I managed to bypass this issue with using Future.delayed and pushNamedAndRemoveUntil

In main_menu_screen I have created method which I later used to redirect to categories.

void redirectToCategory(BuildContext context, String categoryName) {
Future.delayed(Duration.zero, () {
  Navigator.pushNamedAndRemoveUntil(
    context,
    '/recipeScreen',
    (_) => false,
    arguments: BlocProvider.value(
      value: BlocProvider.of<RecipesBloc>(context)
        ..add(LoadRecipesEvent())
        ..category = categoryName,
      child: RecipesScreen(),
    ),
  );
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文