无法保持状态并重建小部件

问题描述 投票:0回答:1

`我正在使用 Riverpod 制作一个 flutter 应用程序。我在注册页面中使用country_state_city_pro.dart。

TextEditingController countryCont = TextEditingController();
TextEditingController stateCont = TextEditingController();
TextEditingController cityCont = TextEditingController();

// Define CountryStateCityPicker widget
CountryStateCityPicker(
  country: countryCont,
  state: stateCont,
  city: cityCont,
  dialogColor: const Color.fromARGB(255, 255, 255, 255),
  textFieldDecoration: InputDecoration(
    fillColor: Color.fromARGB(255, 255, 255, 255),
    filled: true,
    suffixIcon: const Icon(Icons.arrow_downward_rounded),
    border: OutlineInputBorder(borderSide: BorderSide.none),
  ),
  onChanged: (country, state, city) {
    // Accept the value entered by the user and debug print it
    print('Country: $country, State: $state, City: $city');

    // Set the state of the UI and rebuild the widget
    setState(() {
      countryCont.text = country ?? '';
      stateCont.text = state ?? '';
      cityCont.text = city ?? '';
    });
  },
),

问题: 我想根据用户的选择存储小部件的状态并重建小部件以反映用户的选择

我尝试使用 onChanged() 函数,但它给出了一个错误: 未定义名称“onChanged”。 尝试将名称更正为已定义的名称,或定义名称。`您的文本``

flutter controller mobile-application riverpod state-management
1个回答
0
投票

CountryStateCityPicker
小部件不提供
onChanged
参数,但您可以将自己的侦听器添加到控制器:

class MyWidget extends StatefulWidget {
  const MyWidget({super.key});

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  TextEditingController countryCont = TextEditingController();
  TextEditingController stateCont = TextEditingController();
  TextEditingController cityCont = TextEditingController();

  // Define your own `onChanged` method
  void onChanged() {
    final country = countryCont.text;
    final state = stateCont.text;
    final city = cityCont.text;

    // Do something with the values
  }

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

    // Register `onChanged` as the listener for every controller
    countryCont.addListener(onChanged);
    stateCont.addListener(onChanged);
    cityCont.addListener(onChanged);
  }

  @override
  void dispose() {
    // Don't forget to remove the listeners and dispose of the controllers
    countryCont
      ..removeListener(onChanged)
      ..dispose();
    stateCont
      ..removeListener(onChanged)
      ..dispose();
    cityCont
      ..removeListener(onChanged)
      ..dispose();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return CountryStateCityPicker(
      // ...
    );
  }
}

通过这种方法,您还可以灵活地让每个控制器都有自己的侦听器,例如

onCountryChanged
等。

© www.soinside.com 2019 - 2024. All rights reserved.