условно используйте futurebuilder : Flutter

#flutter #dart #future

Вопрос:

У меня есть страница, на которой я получаю данные с сервера с помощью recipeId . На этой странице я использую complete_model (которая содержит все данные модели).

Но при переходе на страницу у меня уже есть доступ к slim_model (содержит только идентификатор, заголовок, изображение).

Как использовать slim_model , чтобы показать title , image а затем заполнить все остальное?

full_view.dart :

 class FullView extends StatefulWidget {
  final String id;

  const FullView({Key? key, required this.id}) : super(key: key);

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

class _FullViewState extends State<FullView> {
  late Future<FullDataModel> future;

  @override
  void initState() {
    future = Repository().getModel(widget.id);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<FullDataModel>(
        future: future,
        builder: (context, snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return const Center(
                child: CircularProgressIndicator(
                  valueColor:
                      AlwaysStoppedAnimation<Color>(ColorConstants.accent1),
                ),
              );
            default:
              if (snapshot.hasError || snapshot.data == null) {
                return const Center(
                  child: Text(
                    'Something went wrong, we are working on fixing it!',
                  ),
                );
              } else {
                final data = snapshot.data!;
                return _body(data, context);
              }
          }
        },
      ),
    );
  }
}
 

Переход к full_view.dart ,

  Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) {
                    return FullView(
                      id: slimData.id,
                    );
                  },
                  fullscreenDialog: true));
 

Здесь у меня уже есть данные идентификатора, заголовка и изображения slimData , я хочу показать это , пока остальные данные загружаются в full_view.dart

Проблема в том, что я должен использовать deep_linking, или иногда у меня нет slimData => У меня есть только > id .

Поэтому, когда у меня есть slimData , я хочу использовать это для отображения заголовка и изображения, пока остальные данные загружаются с помощью id .

Если у меня его нет slimData , я просто хочу загрузить все с помощью id .

Ответ №1:

Поэтому, когда у меня есть slimData, я хочу использовать его для отображения заголовка и изображения, в то время как остальные данные загружаются с помощью идентификатора.

Так… просто сделай это? Там , где у вас в данный момент есть a CircularProgressIndicator , вставьте условное и, если у вас есть SlimData, покажите это вместо индикатора прогресса.

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

1. Это лучший подход? Я думал, что должен поддерживать некоторое состояние, которое изначально заполнено наполовину, но после того, как будущее возвращается, оно заполняется полностью!

2. Конечно, почему бы и нет. Разве это не одно и то же? У вас есть «тонкая» и «полная» переменная. если ни один не заполнен, покажите индикатор выполнения, если заполнен только тонкий, покажите тонкий, если заполнен полный, покажите полный.