Как передать ящик со строкой внутри на следующий экран

#flutter #dart

Вопрос:

У меня есть следующий блок кода, в котором я получаю версию приложения с помощью библиотеки, а затем передаю версию приложения в ящик. Этот ящик я отправляю на следующий экран, но когда я открываю ящик на следующем экране, приложение отображается как НУЛЕВОЕ. В чем может быть проблема ? Я приведу ниже полный исходный код, и, возможно, кто-нибудь сможет помочь мне выяснить, где ошибка.

 import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';

void main() {
  runApp(FirstPage());
}
class FirstPage extends StatefulWidget {
  final String title;

  FirstPage({Key key, this.title}) : super(key: key);
  @override
  _FirstPageState createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  String packageAppVersion = '';

  @override
  void initState() {
    super.initState();
    versionCheck();
  }

  Future<void> versionCheck() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    setState(() {
      packageAppVersion = packageInfo.version;
    });
  }

  Widget buildDrawerForSecondPage(BuildContext context) {
    return new Drawer(
      child: Padding(
        padding: const EdgeInsets.all(10.0),
        child: new Column(
          children: [
            Flexible(
              child: new ListView(
                children: <Widget>[],
              ),
            ),
            Flexible(
              flex: 0,
              child: Text("App version: $packageAppVersion"),
            )
          ],
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Drawer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SecondPage(
        title: 'Second Page',
        drawer: buildDrawerForSecondPage(context),
      ),
    );
  }
}

class SecondPage extends StatefulWidget {
  final String title;
  final Drawer drawer;

  SecondPage({Key key, this.title, this.drawer}) : super(key: key);

  @override
  _SecondPageState createState() => _SecondPageState(drawer);
}

class _SecondPageState extends State<SecondPage> {
  String packageAppVersion = '';
  final Drawer drawer;

  _SecondPageState(this.drawer);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      endDrawer: drawer,
      body: Container(),
    );
  }
}
 

Заранее спасибо.

Ответ №1:

Это потому, что вы используете .then() синтаксис, на самом AppVersion деле он обновляется, но немного позже, отсюда null и значение. Вы могли await бы использовать версию до run() метода , а затем передать ее дальше MaterialApp , или вы могли бы попробовать использовать a setState после печати внутри then() . Дайте мне знать, если это исправит вашу проблему.

Ответ №2:

Изначально значение packageAppVersion равно нулю, именно это отображается в пользовательском интерфейсе. Поэтому для обновления пользовательского интерфейса вам нужно использовать setState . Проверьте приведенный ниже код для лучшего понимания:

 @override
void initState() {
  super.initState();
  versionCheck();
}

Future<void> versionCheck() async {
  PackageInfo packageInfo = await PackageInfo.fromPlatform();
  setState((){
    packageAppVersion = packageInfo.version;
  });
  print('App version received: $packageAppVersion');
}
 

Комментарии:

1. Я не показываю версию приложения на первом экране. Я отображаю его на втором экране ( страница входа в систему).

Ответ №3:

Я нашел исправление для приведенного выше кода, но я не понимаю, почему работает только так (удалено drawer свойство и конструктор из _SecondPageState ) :

 class SecondPage extends StatefulWidget {
  final String title;
  final Drawer drawer;

  SecondPage({Key key, this.title, this.drawer}) : super(key: key);

  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  String packageAppVersion = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(widget.title)),
      endDrawer: widget.drawer,
      body: Container(),
    );
  }
}