Селектор в провайдере флаттера не работает - PullRequest
0 голосов
/ 06 марта 2020

Я использую провайдер 4.0.3

Мой код псевдокода

class MyModel with ChangeNotifier
User user //{nickname: 'john', age: 1}
//...



ChangeNotifierProvider<MyModel>
(create : (_)=>MyModel()
child: //MyModel model = Provider.of(context);
scafold
 body: Column(
   [
      Selector<MyModel, String>(
        selector : (_, m) => m.user.nickname,
        builder : (_,nickname,___) => Text(nickname)
      )
      RaisedButton(onPressed:() => model.user.nickname = 'none' )
   ]
)
//...

Я ожидал

'RaisedButton preesed -> изменить псевдоним.'

но это не работает ..

Что я пропустил?

1 Ответ

1 голос
/ 06 марта 2020

Вы можете скопировать полный код вставки и вставки ниже

фрагмент кода

Selector<ModelProvider, User>(
              builder: (context, data, child) {
                return Text('${data.nickName}');
              },
              selector: (buildContext, modelProvider) => modelProvider.getUser,
            )
...
class ModelProvider extends ChangeNotifier {
  User user = User(nickName: "john", age: 1);

  User get getUser => user;

  setUserNickName(String newNickName) {
    user.nickName = newNickName;
    print(user.nickName);
    notifyListeners();
  }
}

рабочая демонстрация

enter image description here

полный код

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:provider/provider.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (BuildContext context) => ModelProvider(),
        ),
      ],
      child: MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.teal,
          ),
          home: MyHomePage()),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    final modelProvider = Provider.of<ModelProvider>(context, listen: true);
    return SafeArea(
      child: Scaffold(
        body: Center(
            child: Column(
          children: <Widget>[
            Selector<ModelProvider, User>(
              builder: (context, data, child) {
                return Text('${data.nickName}');
              },
              selector: (buildContext, modelProvider) => modelProvider.getUser,
            )
          ],
        )),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            modelProvider.setUserNickName("new name");
          },
        ),
      ),
    );
  }
}

class ModelProvider extends ChangeNotifier {
  User user = User(nickName: "john", age: 1);

  User get getUser => user;

  setUserNickName(String newNickName) {
    user.nickName = newNickName;
    print(user.nickName);
    notifyListeners();
  }
}

class User {
  String nickName;
  int age;

  User({this.nickName, this.age});
}
...