Невозможно обновить пользовательский интерфейс за пределами виджета с использованием шаблона Flutter Bloc

Пробую Блока в трепете. Кажется, он отлично работает при вызове функции блока в виджете с отслеживанием состояния, например:

 RaisedButton(
 onPressed: () => _nextStep(),
 child: Text("Next"))

Это вызовет функцию _nextStep () и обновит пользовательский интерфейс. Функция nextStep:

  _nextStep() async {
_bloc.StepEventSink.add(NextStep());
}

и я использую StreamBuider для виджета, и он работает. Но если я вызываю _nextStep () вне класса, данные обновляются, а пользовательский интерфейс - нет. Пример:

class FormWizard extends StatefulWidget {
  @override
 _FormWizardState createState() => _FormWizardState();
  next() {
_FormWizardState()._nextStep();
  }
 }

Как я могу обновить пользовательский интерфейс вне виджета?


person Adrian    schedule 03.10.2020    source источник
comment
Так что вы предлагаете?   -  person Adrian    schedule 03.10.2020


Ответы (1)


Я решил свою проблему с помощью управления состоянием провайдера. Я объявил класс SteppBloc и присвоил текущему шагу значение 0. Затем используйте notifyListeners для обновления значения виджетов, которые его используют.

StepBloc класс:

import 'package:flutter/material.dart';

class StepperBloc extends ChangeNotifier {
  int _current = 0;
  int get currentStep => _current;

  set currentStep(int val) {
    _current = val;
    notifyListeners();
  }

  increment() {
    _current++;
    notifyListeners();
  }

  decrement() {
    _current--;
    notifyListeners();
  }
}

Затем я оборачиваю основной виджет ChangeNotifierProvider из StepperBloc.

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<StepperBloc>.value(value: StepperBloc())
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: theme(),
        home: loading(),
        //initialRoute: SplashScreen.routeName,
        routes: routes,
      ),
    );
  }
}
person Adrian    schedule 03.10.2020