flutter - 字符串未使用 changeNotifierProvider 更新
问题描述
模型类:
Venue with ChangeNotifier{
String id;
update(String venueId) {
id = venueId;
notifyListeners();
}
}
尝试像这样获取 id 值:
Widget _buildContents(BuildContext context) {
final venue = Provider.of<Venue>(context);
final id = venue.id;
print('@@@@@@@@@@'); //// trying to get the the id here.
}
我的 id 应该在 dropDownButton 的 onTap 回调中更新:
DropdownButton(
....
items: venues.map((venue) {
return DropdownMenuItem<String>(
onTap: () {
venue.update(venue.id);
},
value: venue.name,
child: Text(
venue.name,
style: TextStyle(fontSize: 28),
),
);
}).toList(),
.....
)
Provider.. 位于小部件上方:
MultiProvider(providers: [
ChangeNotifierProvider<Venue>(create: (_) => Venue()),
], child: HomePage());
出事了..救命!?
解决方案
您可以在下面复制粘贴运行完整代码您可以在
代码片段
中使用DropdownButton<Venue>
和调用venue.update
onChanged
DropdownButton<Venue>(
value: dropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (Venue newValue) {
setState(() {
dropdownValue = newValue;
venue.update(newValue.id);
});
},
items: venues.map((venue) {
return DropdownMenuItem<Venue>(
value: venue,
child: Text(
venue.name,
style: TextStyle(fontSize: 28),
),
);
}).toList()
工作演示输出
I/flutter (27988): @@@@@@@@@@ 1
I/flutter (27988): @@@@@@@@@@ 2
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class Venue with ChangeNotifier {
String id;
String name;
update(String venueId) {
id = venueId;
notifyListeners();
}
Venue({this.id, this.name});
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MultiProvider(providers: [
ChangeNotifierProvider<Venue>(create: (_) => Venue()),
], child: HomePage()),
);
}
}
class HomePage extends StatefulWidget {
HomePage({Key key}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Venue dropdownValue;
List<Venue> venues = [
Venue(id: "1", name: "name1"),
Venue(id: "2", name: "name2"),
Venue(id: "3", name: "name3"),
];
@override
Widget build(BuildContext context) {
final venue = Provider.of<Venue>(context);
final id = venue.id;
print('@@@@@@@@@@ $id');
return Scaffold(
appBar: AppBar(
title: Text("demo"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
DropdownButton<Venue>(
value: dropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(color: Colors.deepPurple),
underline: Container(
height: 2,
color: Colors.deepPurpleAccent,
),
onChanged: (Venue newValue) {
setState(() {
dropdownValue = newValue;
venue.update(newValue.id);
});
},
items: venues.map((venue) {
return DropdownMenuItem<Venue>(
value: venue,
child: Text(
venue.name,
style: TextStyle(fontSize: 28),
),
);
}).toList(),
),
],
),
),
);
}
}
推荐阅读
- r - 指定闪亮的表格行数
- java - Java 程序正在生成空的 zip 文件
- c++ - 我解决了循环依赖。解决方案有问题吗?
- reactjs - setInterval 在 ReactJS 中无法正常工作
- node.js - 在nodejs中使用聚合查询未获取数据
- regex - 如何匹配除括号之间的字符串之外的所有内容?
- javascript - 从 DOM 中获取值并传递给函数
- elasticsearch - 向用户授予只读访问权 IBM Cloud Elasticsearch
- javascript - 单击按钮x次后如何滚动到div的底部?
- javascript - 使用 JSON 对象元素填充选择选项